背景
我们知道这个概念std::same_as
与顺序无关(换句话说,对称):std::same_as<T, U>
等同于std::same_as<U, T>
(相关问题)。在这个问题中,我想实现一些更通用的东西:template <typename ... Types> concept same_are = ...
检查包中的类型是否Types
彼此相等。
我的尝试
#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;
}
(我的目的是枚举包中每一个可能的有序类型对)
不幸的是,这段代码无法编译,编译器抱怨调用foo(int, int)
不明确。我相信它认为are_same<U, T>
和are_same<T, U>
不等同。我想知道为什么代码失败了我该如何修复它(以便编译器将它们视为等效)?