Одна специализация шаблона для нескольких значений enum - PullRequest
0 голосов
/ 28 ноября 2018

Обычно, если я хочу иметь шаблонный (data) класс по enum, я бы написал что-то вроде этого

enum class Modes : int
{
    m1 = 1,
    m2 = 2,
    m3 = 3
};

template <Modes M>
class DataHolder
{
};

template<>
class DataHolder<Modes::m1>
{
    public: int a = 4;
};

Тогда, если я хочу получить ту же специализацию для Modes::m1, что и для Modes::m2Я бы снова написал ту же специализацию.Есть ли способ написать одну специализацию для нескольких значений enum?Я пробовал это с SFINAE, но я не успешен.

template <Modes M, typename = void>
class DataHolder
{
};

template<Modes M, typename = typename std::enable_if<M == Modes::m1 || M == Modes::m2>::type>
class DataHolder
{
    public: int a = 4;
};

Это не компилируется.Особенно после того, как я хотел бы продолжить с другой специализацией для Modes::m3.Я пробовал много похожего решения, найденного здесь на SO, но, похоже, ничего не решает проблему.

1 Ответ

0 голосов
/ 28 ноября 2018

Вы должны поместить enable_if в явную специализацию DataHolder, которая соответствует стандартной.Специализация будет выбрана, если условие в enable_if оценивается как true.

template <Modes M, typename = void>
class DataHolder
{
};

template<Modes M>
class DataHolder<M, typename std::enable_if<M == Modes::m1 || M == Modes::m2>::type>
{
    public: int a = 4;
};

int main()
{   
    DataHolder<Modes::m1> a; a.a;
    DataHolder<Modes::m3> b; /* b.a; */
}

живой пример на godbolt.org

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