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

标签 c++ templates c++14 sfinae

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

#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 在这里缺少什么?

最佳答案

当模板参数推导期间发生替换失败时,它不是大象

此外,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++-14 使用 enable_if_t 选择整数类型模板化类的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36902397/

相关文章:

java - C++中的结果类型和重新定义

c++ - 在哪些情况下我们需要保护继承?

c++ - 具有非类型模板的结构的C++实例化

c++ - std::atomic 的默认值是多少?

c++ - 如何声明 vector::size_type 的 vector ?

c++ - 计算字母时出现奇怪的编译器错误

c++ - 通过 C/C++ 使用 JPEG 像素格式在 v4l2 中设置/获取相机 jpeg 压缩质量

c++ - 类型特征以使用具有const变体的特定方法检测结构

C++ |只有引用变量在函数模板中起作用

c++ - 按值返回的函数的值类别是否总是 xvalue?