C++14 の変数テンプレートで ::value を省く

C++11 で template alias が入ったことにより,テンプレートメタプログラミングでよく出てくる,メタ関数を評価するための typename ::type を省略して直接型を取得するようなエイリアスが書けるようになりました.

template<bool B, class T>
using enable_if_ = typename std::enable_if<B, T>::type;

enable_if_<true, int> i; // typename std::enable_if<true, int>::type と同じ

C++14 ではこの要領で,値を評価するときに使う ::value も省略できます.これには変数テンプレートを使います.

template<class T, class U>
static constexpr bool is_same_ = std::is_same<T, U>::value;

is_same_<int, int>; // std::is_same<int, int>::value と同じ

上のエイリアスと合わせると,かなりすっきりする気がします.

typename std::enable_if<std::is_same<int, int>::value, int>::type
enable_if_<is_same_<int, int>, int>

よく ::value を書かされるメタ関数については定義しておくと便利かもしれません.