2015-07-21 99 views
2

很多时候我使用过SFINAE,但我有一个非常简单的例子,我今天无法运行。SFINAE没有编译

class X 
{ 
    public: 
     template <typename CHECK, typename = typename std::enable_if< std::is_floating_point<CHECK>::value, void>::type > 
      void Do() 
      { 
       std::cout << "yes" << std::endl; 
      } 

     template <typename CHECK, typename = typename std::enable_if< !std::is_floating_point<CHECK>::value, void>::type> 
      void Do() 
      { 
       std::cout<< "no" << std::endl; 
      } 

}; 

int main() 
{ 
    X x; 
    x.Do<float>(); 
} 

错误:

的src/main.cpp中:20:18:错误: '模板空隙X :: DO()' 不能被重载

的src/main.cpp中:14: 18:错误:与“模板无效X :: DO()” 无效DO()

我想禁用与enable_if任何超载,但它不工作...

任何想法,今天我做错了吗?

回答

2

这两个函数具有相同的签名,所以您会得到重定义错误。与替代以下,使用默认参数尝试:

#include <type_traits> 
#include <iostream> 

class X 
{ 
    public: 
     template <typename CHECK, std::enable_if_t< std::is_floating_point<CHECK>::value>* =nullptr > 
      void Do() 
      { 
       std::cout << "yes" << std::endl; 
      } 

     template <typename CHECK, std::enable_if_t< !std::is_floating_point<CHECK>::value>* =nullptr> 
      void Do() 
      { 
       std::cout<< "no" << std::endl; 
      } 

}; 

int main() 
{ 
    X x; 
    x.Do<float>(); 
} 

DEMO

又见答案herehere

+0

感谢。但是我对enable_if的工作原理有一个很大的误解。我认为如果条件为false,并且结果模板将被“禁用”,并且由于我只有一个不能超载的实例,enable_if将导致“编译错误”。但现在我有一个超载,SFINAE似乎不工作。你能解释一下吗? – Klaus

0

来编译和作品的另一种语法是将enable_is移动作为返回类型:

class X 
{ 
public: 
    template <typename CHECK > 
    typename std::enable_if< std::is_floating_point<CHECK>::value, void>::type Do() 
    { 
     std::cout << "yes" << std::endl; 
    } 

    template <typename CHECK> 
    typename std::enable_if< !std::is_floating_point<CHECK>::value, void>::type Do() 
    { 
     std::cout << "no" << std::endl; 
    } 

}; 

int main() 
{ 
    X x; 
    x.Do<float>(); 
    getchar(); 
}