我已经获得了enable_if工作的代码,它允许我做一些很棒的东西,但我认为它会导致错误,因为下面显示的两个方法具有相同的方法签名。
任何人都知道为什么允许这样做?
#include <iostream>
#include <boost/type_traits>
template<bool T, class R = void>
struct enable_if{
typedef R type;
};
template<class R>
struct enable_if<false, R>{
};
template<class T>
typename enable_if<boost::is_pod<T>::value >::type print(const T& item){
std::cout << "T is a pod with the value: " << item << std::endl;
}
template<class T>
typename enable_if<!(boost::is_pod<T>::value) >::type print(const T& item){
std::cout << "T is not a pod with the value: " << item << std::endl;
}
int main(int argc, const char * argv[])
{
print(1);
return 0;
}
答案 0 :(得分:5)
下面显示的两种方法具有相同的方法签名
仔细观察:
… enable_if< boost …
VS
… enable_if< ! boost …
他们不一样,他们是对立的。如果禁用一个,则启用另一个。这保证了调用者始终可以看到一个。 (请记住,如果条件为假,enable_if
会使声明完全不可见。)
答案 1 :(得分:0)
两个模板函数执行具有相同的签名,就重载决策而言。如果它们都被实例化为任何请求的类型,则会出现错误。
但是,当enable_if
成功而另一个失败时,而不是因替换失败而产生编译错误,没有错误 (SFINAE:“替换失败不是错误”),编译器只是忽略其中一个,就好像它不存在一样。
因此,只为给定类型实例化两个模板中的一个,并且没有重载解析错误。
答案 2 :(得分:-1)
这两种方法因返回类型而不同,例如,通过enable_if的模板特化。