如何使用static_assert模板枚举类型? (C ++ 11)

时间:2014-11-10 01:01:27

标签: c++ c++11 enums

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()和其他类型的支持似乎不适用于我的情况。我如何实现它?

3 个答案:

答案 0 :(得分:7)

来自http://en.cppreference.com/w/cpp/language/static_assertstatic_assert语法。

static_assert ( bool_constexpr , message );

您需要提供一条消息。类似的东西:

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

答案 1 :(得分:3)

问题不在枚举中。您只需向static_assert添加消息:

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

答案 2 :(得分:1)

在C ++ 11中,static_assert需要一条消息,但是n3928建议static_assert的默认字符串文字,允许您省略该消息。这已经在Clang中以C ++ 1z模式实现,并作为C ++ 1y / 14模式的扩展实现。

static_assert(0);

Live example