模板 class 与 std::enable_if_t,静态 const 成员初始化

Template class with std::enable_if_t, static const member initialization

好吧,在找了半天却没有找到任何似乎有效的答案后,我得问一下:

说我有一个 class(人为的例子,但希望现在足够好)

template <typename T, std::enable_if_t< MyConditional<T>::value >>
class MyClass
{
public:
    static const MyClass ZeroInited;

    MyClass(int x, int y) 
        : m_X(x)
        , m_Y(Y) 
    {
    }

    ...
};

如何正确初始化 ZeroInited*?正确的语法让我望而却步(或者也许我只是太累了),让工具 "Create Implementation" 也不会产生正确的输出。这是

谢谢大家!

*) PS:在模板化的情况下,不用于专业化。如果我省略了 enable_if_t 就很简单了:

template <typename T> const MyClass<T> MyClass<T>::ZeroInited {0, 0};

但是一旦 enable_if_t 发挥作用,我就不知道如何更改它了。

如果你可以使用 C++17,你可以声明 ZeroInited inline 并在声明中初始化它(因为这也是一个定义):

static const inline MyClass ZeroInited { 10, 20 };

Live demo

我不确定你是如何在 C++14 及更早版本中解决这个问题的。

问题

template <typename T, std::enable_if_t< MyConditional<T>::value >>

是您期望作为第二个参数的 void value,它不存在。

  • 使用

    template <typename T, std::enable_if_t< MyConditional<T>::value, bool> = false>
    class MyClass{/*..*/};
    

    template <typename T, std::enable_if_t< MyConditional<T>::value, bool > B>
    const MyClass<T, B> MyClass<T, B>::ZeroInited{0, 0};
    

    Demo

  • template <typename T, typename /*U*/ = std::enable_if_t< MyConditional<T>::value>>
    class MyClass{/*..*/};
    

    template <typename T, typename U>
    const MyClass<T, U> MyClass<T, U>::ZeroInited{0, 0};
    

    Demo