C++-14 使用enable_if_t在整型上选择类模板化的成员函数
C++-14 using enable_if_t to select member function of class templated on integral type
我正在尝试基于完整的类模板参数启用不同的成员函数,如下所示:
#include <type_traits>
template<int Dimension>
struct Foo
{
template<std::enable_if_t<Dimension == 1> = 0>
int bar(int i) const { return i; }
template<std::enable_if_t<Dimension == 2> = 0>
int bar(int i, int j) const { return i + j; }
};
int main(int argc, const char **argv)
{
Foo<1> a;
a.bar(1);
Foo<2> b;
b.bar(1,2);
return 0;
}
在 c++-14 模式下使用 gcc5,编译失败,并出现以下错误:
tools/t1.cpp: In instantiation of 'struct Foo<1>':
tools/t1.cpp:18:12: required from here
tools/t1.cpp:13:9: error: no type named 'type' in 'struct std::enable_if<false, int>'
int bar(int i, int j) const { return i + j; }
^
tools/t1.cpp: In instantiation of 'struct Foo<2>':
tools/t1.cpp:21:12: required from here
tools/t1.cpp:10:9: error: no type named 'type' in 'struct std::enable_if<false, int>'
int bar(int i) const { return i; }
这些似乎表明 SFINAE 没有按照我的预期做事,因为enable_if_t似乎工作正常。
在这个微不足道的示例中,重载也可以工作,但在我的实际用例中,我需要隐藏函数以防止意外使用和/或编译错误,具体取决于情况。
我在这里缺少什么?
替换失败在模板参数推导期间发生时不是大象。
此外,enable_if_t<true>
是void
的,并且您不能void
模板非类型参数。
使用默认模板参数延迟评估:
template<int Dimension>
struct Foo
{
template<int..., int I = Dimension, std::enable_if_t<I == 1, int> = 0>
int bar(int i) const { return i; }
// etc.
};
未命名的参数包int...
防止尝试显式指定I
。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针