Как использовать> (больше-чем) внутри параметра шаблона и не получить ошибку синтаксического анализа?

Я хочу только определить функцию, основанную на размере параметра шаблона:

template <class T>
typename std::enable_if<sizeof(T) > 1, void>::type
foobify(T v) {
    // ...
}

int main() {
    //foobify((unsigned char)30); // should not compile
    foobify((long)30);
}

Однако я получаю:

main.cpp:8:41: error: expected unqualified-id before numeric constant
     typename std::enable_if<sizeof(T) > 1, void>::type

Это работает, если я вместо этого 1 < sizeof(T). Таким образом, я считаю, что GCC думает, что я заканчиваю параметр шаблона, вместо продолжения булевского выражения.

Можно ли использовать > сам, не обойдя его?

Ответы

Ответ 1

Да, выражения с использованием этого оператора должны быть заключены в скобки. См. [Temp.names]/3:

При анализе списка шаблонов-аргументов первый не-вложенный > 138 принимается за конечный разделитель а не оператор большего размера. [..] [Пример:

template<int i> class X { /* ...*/ };

X< 1>2 > x1; // syntax error
X<(1>2)> x2; // OK

- конец примера]

138) A >, который включает идентификатор типа dynamic_cast, static_cast, reinterpret_cast или const_cast или который охватывает template-arguments следующего идентификатора шаблона, считается вложенным для целей этого описания.

Ясно, что это не применяется, если вы используете симметричный аналог этого сравнения, т.е. используя <, вместо этого - разбор в этом случае недвусмыслен.

Ответ 2

Да, вы должны использовать круглые скобки:

template <class T>
typename std::enable_if<(sizeof(T) > 1), void>::type
foobify(T v) {
    // ...
}