c++ - 了解 SFINAE 示例

标签 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> 时不会导致替换错误做。

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

最佳答案

如评论中所述,您必须添加 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;
}

关于c++ - 了解 SFINAE 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40040070/

相关文章:

c++ - 在计算负数的二进制补码时如何实现添加 "+1"步骤

c++ - 如何正确分割字符串中的数字?

c++ - boost::static_visitor 未能专门化具有多种不同可能类型的函数模板

javascript - Angular.js 模板解析钩子(Hook)

c++ - 用于从 USB MIDI 设备读取 MIDI 信号的 C/C++ 库

c# - 覆盖基类方法

c++ - typedef 类型名和从属范围

c++ - 有没有办法强制自动推导考虑 operator <some_type>() 而不是复制赋值?

c++ - 使用 constexpr 函数替代 reinterpret_cast

c++ - 为什么在这种情况下将此指针视为右值?