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

C++-14 using enable_if_t to select member function of class templated on integral type

本文关键字:函数 成员 选择 enable 使用 if 整型 C++-14      更新时间:2023-10-16

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

#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