这个问题的答案几乎存在,但我找不到。
下面的代码由于将整数类型隐式转换为bool而无法正常工作。
template <typename T, typename std::enable_if<std::is_integral<T>::value &&
std::is_signed<T>::value &&
!std::is_same<T, bool>::value, T>::type>
inline void test(T) { std::cout << "int" << std::endl; }
inline void test(bool) { std::cout << "bool" << std::endl; }
int main()
{
test(int());
test(bool());
}
要解决此问题,我已经尝试过:
std::enable_if<std::is_same<T, bool>::value, T>::type>
出现布尔过载但全部无效(编译错误或两次bool调用)。
有什么办法可以将这两个重载分开?
答案 0 :(得分:2)
问题在于,对于第一个重载,无法推导被声明为非类型参数的第二个模板参数,并且根本无法使第一个重载can't be selected。
您可以为第二个模板参数指定默认值。例如
template <typename T, typename std::enable_if<std::is_integral<T>::value &&
std::is_signed<T>::value &&
!std::is_same<T, bool>::value, T>::type = 0>
// ^^^
inline void test(T) { std::cout << "int" << std::endl; }