Hintergrund
Wir wissen, dass das Konzept std::same_asunabhängig von der Ordnung ist (mit anderen Worten, symmetrisch): std::same_as<T, U>äquivalent zu std::same_as<U, T>( verwandte Frage ). In dieser Frage möchte ich etwas Allgemeineres implementieren: template <typename ... Types> concept same_are = ...Das prüft, ob die Typen im Paket Typesgleich sind.
Mein Versuch
#include <type_traits>
#include <iostream>
#include <concepts>
template <typename T, typename... Others>
concept same_with_others = (... && std::same_as<T, Others>);
template <typename... Types>
concept are_same = (... && same_with_others<Types, Types...>);
template< class T, class U> requires are_same<T, U>
void foo(T a, U b) {
std::cout << "Not integral" << std::endl;
}
// Note the order <U, T> is intentional
template< class T, class U> requires (are_same<U, T> && std::integral<T>)
void foo(T a, U b) {
std::cout << "Integral" << std::endl;
}
int main() {
foo(1, 2);
return 0;
}
(Meine Absicht hier ist es, über jedes mögliche geordnete Paar von Typen in der Packung aufzuzählen)
Leider würde dieser Code nicht kompiliert , und der Compiler beschwert sich, dass der Aufruf von nicht foo(int, int)eindeutig ist. Ich glaube, dass es betrachtet are_same<U, T>und are_same<T, U>als nicht gleichwertig. Ich möchte wissen, warum der Code fehlschlägt, wie ich ihn beheben kann (damit der Compiler sie als gleichwertig behandelt).
... Typessind? Vielleicht kann Ihnen std :: connection helfen. Am Ende der Seite befindet sich ein Beispiel, das Ihrem Ansatz ähnelt.
same_with_othersjede mögliche Permutation der Typen ausführt .