【问题标题】:Template class with std::enable_if_t, static const member initialization带有 std::enable_if_t 的模板类,静态 const 成员初始化
【发布时间】:2020-10-07 19:45:42
【问题描述】:

好吧,在半死不活地搜索自己并没有找到任何实际上似乎有效的答案之后,我得问:

假设我有一门课(人为的例子,但希望现在已经足够好了)

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*?正确的语法只是让我无法理解(或者我可能只是太累了),并且让工具“创建实现”也不会产生正确的输出。这是

谢谢大家!

*) PS:在模板化的情况下,不是专门化的。如果我省略 enable_if_t 很容易:

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

但我不知道一旦 enable_if_t 起作用后如何更改它。

【问题讨论】:

    标签: c++ templates initialization enable-if


    【解决方案1】:

    问题

    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

    【讨论】:

      【解决方案2】:

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

      static const inline MyClass ZeroInited { 10, 20 };
      

      Live demo

      我不确定您如何在 C++14 及更早版本中解决此问题。

      【讨论】:

      • 这当然是一个解决方案,但我尽量保持我的接口(如在类声明中,而不是 C# 的含义)干净(纯声明,没有实现),并将实现放在一个 inl 文件中。无论如何,谢谢,这绝对是一个可行的选择。
      猜你喜欢
      • 2011-03-19
      • 2012-02-02
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多