模板 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 };
我不确定你是如何在 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};
或
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};
好吧,在找了半天却没有找到任何似乎有效的答案后,我得问一下:
说我有一个 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 };
我不确定你是如何在 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};
或
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};