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() и поддержка другого типа, похоже, не работают в моем случае. Как мне это достичь?
Синтаксис для 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");
Проблема не в перечислении. Вам просто нужно добавить сообщение в static_assert
:
static_assert(T == Bishop || T == Knight, "message");
В С++ 11 static_assert
требует сообщения, однако n3928 предлагает строковый литерал по умолчанию для static_assert
, что позволяет вам опустить сообщение. Это уже реализовано в Clang в режиме С++ 1z и как расширение в режиме С++ 1y/14.
static_assert(0);