Hintergrund
Wir wissen, dass das Konzept std::same_as
unabhä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 Types
gleich 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).
... Types
sind? Vielleicht kann Ihnen std :: connection helfen. Am Ende der Seite befindet sich ein Beispiel, das Ihrem Ansatz ähnelt.
same_with_others
jede mögliche Permutation der Typen ausführt .