如果您可以访问 decltype,则可以相对轻松地进行自己的检查。
template <class T, class U> class check_same_type_t;
template <class T> class check_same_type_t<T, T> { };
template <class T, class U>
void foo()
{
U a,b;
check_same_type_t<bool, decltype(T()(a, b))> check;
bool truthiness = T()(a,b);
if (truthiness) ;
// do something
}
这启用了以下功能:
struct A {
bool operator()(int, int) { return true; }
};
struct B {
int operator()(int, int) { return 1; }
};
int
main()
{
foo<A, int>(); // will compile
foo<B, int>(); // won't compile
}
只要确保这是你真正想要的。强制通用算法使用特定类型可能会反过来咬你。如果一个类型可以隐式转换为 bool,为什么在你的条件下使用它不令人满意?