Проверка параметра шаблона по значению enum в std :: is_same - PullRequest
1 голос
/ 28 февраля 2020

Примите во внимание следующее:

enum color {
    r, g, b 
};

template <color T>
constexpr bool is_green = std::is_same<T, color::g>::value; 

g ++ не может скомпилировать это, ошибка с

ошибка: несоответствие типа / значения в аргументе 1 в списке параметров шаблона для template<class, class> struct std::is_same

Вполне приемлемо объявить шаблонный класс, используя параметр enum как

template <color foo>
class widget

, поэтому, похоже, что также должен быть какой-то способ проверить значение ( для последующего использования в условном выражении; static_if было бы неплохо, но для этого требуется c ++ 17).

Ответы [ 2 ]

5 голосов
/ 28 февраля 2020

std::is_same сравнивается для типов , а не значений . Вы можете просто использовать == для сравнения значений. например,

template <color T>
constexpr bool is_green = T == color::g; 

и

Очевидно, что можно объявить шаблонный класс с помощью параметра enum

Да, вы можете. Но обратите внимание, что это нетипизированный параметр шаблона , а не тип шаблона параметра .

1 голос
/ 28 февраля 2020
template <color T>
constexpr bool is_green = T == color::g;

Я имею в виду ... да :)

...