C ++-14使用enable_if_t选择以整数类型为模板的类的成员函数

随机位

我试图基于一个完整的类模板参数启用不同的成员函数,如下所示:

#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似乎工作正常。

在这个简单的示例中,重载也可以工作,但是在我的实际用例中,我需要根据情况隐藏函数以防止意外使用和/或编译错误。

我在这里与SFINAE缺少什么?

TC

当模板参数推论发生时,替代失败不是一件容易的事

另外,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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C++在构造函数中选择类成员的模板类型

C ++-通过enable_if_t推导参数包(可变模板)构造函数和复制构造函数

成员函数中的C ++ SFINAE enable_if_t,如何消除歧义?

如何在C ++中为多个类类型指定相同的模板化成员函数?

模板类的C ++成员函数的自动返回类型

如何使用type_traits仅在特定类型上添加模板类的成员函数。C ++

C ++ enable_if_t SFINAE

C ++使用模板类调用非静态成员函数

c ++模板为特定类型的类调用特定的构造函数

类成员函数的C ++ Functor模板

成员函数的C ++条件模板类定义

在CPP文件中使用IMPLICIT实例化而不是.H来为类成员函数放置C ++模板定义?

在C ++中,为什么不能使用另一个类的模板类型来与模板类成员函数成为朋友?

C ++模板:从基类调用派生模板类的成员函数

模板函数上的 C++ 模板类成员

在C ++中将模板与类一起使用时,类成员函数的答案错误?

C ++类模板作为函数返回类型

从成员类型推断类型的C ++函数模板?

专门针对模板类的C ++类成员函数

类的析构函数是否会自动为char *类型的数据成员释放内存?C ++

fn(); 之间有区别吗?和 fn<T>(); 在 C++ 的模板类成员函数中

如何使用C ++模板参数来确定类中的成员类型

C ++:返回类型为T且不带T类型参数的模板函数将无法编译

C ++根据其模板定义类成员类型

operator << C ++中模板类中成员类型的重载

为成员函数回调C ++ 14绑定或Lambda

如何使用函数更新c ++类成员?

C ++模板化函数可以选择成员变量吗?

如何使用模板类型作为函数参数派生抽象模板类(C ++ 11)