为什么boost :: enable_if不会导致重复的重载方法编译错误

时间:2012-04-24 13:50:56

标签: c++ boost sfinae

我已经获得了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;
}

3 个答案:

答案 0 :(得分:5)

  

下面显示的两种方法具有相同的方法签名

仔细观察:

… enable_if< boost …

VS

… enable_if< ! boost …

他们不一样,他们是对立的。如果禁用一个,则启用另一个。这保证了调用者始终可以看到一个。 (请记住,如果条件为假,enable_if会使声明完全不可见。)

答案 1 :(得分:0)

两个模板函数执行具有相同的签名,就重载决策而言。如果它们都被实例化为任何请求的类型,则会出现错误。

但是,当enable_if 成功而另一个失败时,而不是因替换失败而产生编译错误,没有错误 (SFINAE:“替换失败不是错误”),编译器只是忽略其中一个,就好像它不存在一样

因此,只为给定类型实例化两个模板中的一个,并且没有重载解析错误。

答案 2 :(得分:-1)

这两种方法因返回类型而不同,例如,通过enable_if的模板特化。