Класс шаблона с инициализацией члена std :: enable_if_t, stati c const - PullRequest
1 голос
/ 18 июня 2020

Хорошо, обыскав себя до полусмерти и не найдя никакого ответа, который, казалось, действительно работал, я должен спросить:

Скажем, у меня есть класс (надуманный пример, но, надеюсь, достаточно хороший на данный момент)

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 войдет в игру.

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Проблема с

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

заключается в том, что вы ожидаете в качестве второго аргумента void значение , которого не существует.

  • используйте

    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};
    

    Демо

2 голосов
/ 18 июня 2020

Если вы можете использовать C ++ 17, вы можете объявить ZeroInited inline и инициализировать его в объявлении (так как тогда это тоже определение):

static const inline MyClass ZeroInited { 10, 20 };

Live demo

Я не уверен, как вы решите эту проблему в C ++ 14 и ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...