通常の (弱い) 列挙がある場合、その列挙値を非型テンプレート パラメーターとして使用できます。次のようにします。
enum { Cat, Dog, Horse };
template <int Val, typename T> bool magic(T &t)
{
return magical_traits<Val>::invoke(t);
}
そしてそれを次のように呼び出します:magic<Cat>(t)
私が見る限り、厳密に型指定された列挙型があり、列挙型をハードコーディングしたくない場合は、次のようになります。
enum class Animal { Cat, Dog, Horse };
template <typename EnumClass, EnumClass EnumVal, typename T> bool magic(T &t)
{
return magical_traits<EnumVal>::invoke(t);
}
そして今、私は書く必要があります: magic<Animal, Animal::Cat>(t)
、これは冗長に思えます。
列挙型クラスと値の両方を入力しないようにする方法はありますか?
#define MAGIC(E, T) (magic<decltype(E), E>(T));