めためた.hpp

メタプログラミングをこよなく愛する人に向けた云々かんぬん

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() {};

多少冗長にはなったが、演算子もなくなったし綺麗になった気がする。

実用性?多少意味が分かりやすくなったことぐらいじゃないかな……