Как статически перечислить типы перечисления шаблонов? (C ++ 11)

0
enum PieceType
{
    NoPieceType, Pawn, Knight, Bishop, Rook, Queen, King,
    AllPieces = 0,
    PieceType_N = 8
};

template<PieceType T> Score OutpostEvaluator()
{
    static_assert(T == Bishop || T == Knight); // Doesn't compile.....
}

Я хочу убедиться, что функция шаблона может использоваться только для определенных типов значений перечисления, Bishop и Knight в моем случае здесь. std :: is_scalar(), std :: is_enum() и поддержка другого типа, похоже, не работают в моем случае. Как мне это достичь?

Теги:
c++11
enums

3 ответа

7
Лучший ответ

Синтаксис для static_assert, от http://en.cppreference.com/w/cpp/language/static_assert.

static_assert ( bool_constexpr , message );

Вам необходимо предоставить сообщение. Что-то вроде:

static_assert(T == Bishop || T == Knight, "Expected Bishop or Knight");
3

Проблема не в перечислении. Вам просто нужно добавить сообщение в static_assert:

static_assert(T == Bishop || T == Knight, "message");
1

В С++ 11 static_assert требует сообщения, однако n3928 предлагает строковый литерал по умолчанию для static_assert, что позволяет вам опустить сообщение. Это уже реализовано в Clang в режиме С++ 1z и как расширение в режиме С++ 1y/14.

static_assert(0);

Живой пример

Ещё вопросы

Сообщество Overcoder
Наверх
Меню