我想定义一个函数,其行为取决于它的参数是否为 pod 类型,我这样做有两种方式:
第一
template <typename T, typename = typename std::enable_if<std::is_pod<T>::value>::type>
void f(const T&) {
//...
}
template <typename T, typename = typename std::enable_if<!std::is_pod<T>::value>::type>>
void f(const T&) {
//...
}
第二
template <typename T>
typename std::enable_if<std::is_pod<T>::value>::type f(const T&) {
//...
}
template <typename T>
typename std::enable_if<!std::is_pod<T>::value>::type f(const T&) {
//...
}
第二个效果很好而第一个是错误。编译器在第一种情况下抱怨重新定义f 。我想知道他们之间的区别。为什么第一个是错误。
感谢您的阅读,请帮帮我!
答案 0 :(得分:7)
模板参数列表上的默认参数不是函数签名的一部分,因此,两个重载具有来自编译器角度的相同签名。
相反,您可以将std::enable_if
的结果作为模板参数本身:
template <typename T, typename std::enable_if<std::is_pod<T>::value, int>::type = 0>
void f(const T&) {}
template <typename T, typename std::enable_if<!std::is_pod<T>::value, int>::type = 0>
void f(const T&) {}