了解SFINAE示例

时间:2016-10-14 09:46:46

标签: c++ templates c++14 sfinae

我很难理解SFINAE。例如,我不明白为什么以下代码无法编译:

#include <iostream>
using namespace std;

// first implementation
template< size_t M, std::enable_if<M==1,size_t>::type = 0>
int foo()
{
  return 1;
}

// second implementation
template< size_t M, std::enable_if<M!=1,size_t>::type = 0>
float foo()
{
  return 1.0f;
}

int main() {
  std::cout << foo<1>() << std::endl;

  return 0;
}

我预计会出现以下行为:foo<1>使用第一个实现,因为std::enable_if < M==1,size_t>::type = 0>导致std::enable_if < M!=1,size_t>::type = 0>没有替换错误。

有没有人在我的论证中看到错误?

1 个答案:

答案 0 :(得分:1)

正如评论中所述,您必须在typename之前添加std::enable_if,因为::typedependent type

template< size_t M, typename std::enable_if<M==1,size_t>::type = 0>
int foo()
{
  return 1;
}

在C ++ 14中,您可以使用std::enable_if_t,这是std::enable_if<...>::type的别名,并“嵌入”其他typename

template< size_t M, std::enable_if_t<M==1,size_t> = 0>
int foo()
{
  return 1;
}