理解一个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
,因为::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;
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 使用 SFINAE 测试是否可以将一个指针类型static_cast到另一个指针类型
- SFINAE :知道一个函数是否已经存在
- 以不同的方式调度 r 值和 l 值,并使用 sfinae 禁用一个选项
- 类模板中的 typedef 的 SFINAE 失败是指另一个类模板中的 typedef
- 使用SFINAE检查该类是否相同或是从C++98中的另一个模板类派生的
- 应用SFINAE检查是否为T定义了一个trait
- 理解一个SFINAE的例子
- SFINAE -用一个参数检测构造函数
- 具有零或一个参数的函数上的 Sfinae