首页 > 解决方案 > std::enable_if 跨编译器的不同行为(取决于外部类模板参数)

问题描述

我有一个嵌套的 ( Inner) 类,我想要一个构造函数,这取决于封闭类 ( ) 有enable_if多少模板参数 ( ) 。ArgsOuter

我想出了下面的代码,只是发现它在某些编译器上编译得很好,而在某些编译器上却没有。

#include <tuple>
#include <type_traits>


template <typename... Args>
struct Outer {

    struct Inner {
        Inner(const Outer* out, Args... vals) 
            : outer(out)
            , values(vals...)
         {}

         // This ctor should be enabled only if Args are non-empty
         template <typename = std::enable_if_t<(sizeof...(Args) > 0)>>
         Inner(const Outer* out)
            : outer(out)
         {}

        const Outer* outer;
        std::tuple<Args...> values;
    };

};

int main()
{
    Outer<int, int> o1;
    Outer<int, int>::Inner i1(&o1, 1, 2);
    Outer<int, int>::Inner i11(&o1);

    Outer<> o2;
    Outer<>::Inner i2(&o2);
    Outer<>::Inner i21(nullptr);

}

显示在 Godbolt 上:https ://godbolt.org/z/lsivO9

有趣的部分是结果:


所以,问题:

标签: c++c++11templatesgccenable-if

解决方案


You need to make std::enable_if dependent on the constructor template parameter

template <std::size_t N = sizeof...(Args), std::enable_if_t<(N > 0), bool> = true>
Inner(const Outer* out)
: outer(out)
{}

推荐阅读