5

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

3 回答 3

5

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

仔细看:

… enable_if< boost …

对比

… enable_if< ! boost …

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

于 2012-04-24T13:56:44.220 回答
0

就重载决议而言,这两个模板函数确实具有相同的签名。如果它们都针对任何请求的类型进行了实例化,则会出现错误。

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

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

于 2012-04-24T16:35:40.623 回答
-1

这两种方法在返回类型上有所不同,例如,通过 enable_if 的模板特化。

于 2012-04-24T13:53:34.600 回答