理解一个SFINAE的例子

Understanding an SFINAE example

本文关键字:SFINAE 一个      更新时间:2023-10-16

我很难理解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,因为::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;
}