is_sameのenum版
is_same_enum
enable_ifをよく書くのだけども値同士を比較するのになんだかいまいちこれっていうのがない
POD型の値ならばboostのmplで比較ができるが、enumはなんだかいいのが見つからない。
(僕の知識不足かもしれないですが)
一応std::enable_ifはboolの値を取るので以下のような書き方もできる
#include <type_tratis> extern void * enabler; enum class test_enum { hoge, hogehoge, }; template<test_enum _E , typename std::enable_if<_E == test_enum::hoge>::type *& = enabler> void f() {};
しかしなんか汚い。
出来ればenable_ifの中に演算子を書きたくない
というわけで書いた。
コード
#include <type_traits> template<class _T> struct is_same_enum { template<_T L, _T R> struct compare : public std::false_type {}; template<_T L> struct compare<L,L> : public std::true_type {}; }; extern void * enabler; enum class test_enum { hoge, hogehoge, }; template<test_enum _E , typename std::enable_if<is_same_enum<test_enum>::compare<_E,test_enum::hoge>::value>::type *& = enabler> void f() {};
多少冗長にはなったが、演算子もなくなったし綺麗になった気がする。
実用性?多少意味が分かりやすくなったことぐらいじゃないかな……