了解 SFINAE 示例

Understanding an SFINAE example

我很难理解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> 会。

有没有人看出我论证的错误?

如评论中所述,您必须在 std::enable_if 之前添加 typename 因为 ::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 的别名,"embeds" 附加的 typename:

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