::value を短くする

最近、よく使っているんですが、std::integral_constant は、

constexpr operator value_ type() { return value; }


を定義しているのでこんな感じで渡すことも出来ます。

[ソース]

#include <iostream>
#include <type_traits>

extern void* enabler;

template<bool B, typename T = void>
using enabler_if = typename std::enable_if<B, T>::type*&;


template<
    typename T,
    enabler_if<std::is_integral<T>{}> = enabler
>
void
func(T){
    std::cout << "integral" << std::endl;
}

template<
    typename T,
    enabler_if<!std::is_integral<T>{}> = enabler
>
void
func(T){
    std::cout << "no integral" << std::endl;
}


int
main(){
    // ::value ではなくて、{} を使う
    static_assert(std::is_same<int, int>{}, "");
    static_assert(!std::is_same<int, char>{}, "");
    
    func(42);
    func('c');
    func(3.14f);

    return 0;
}

[出力]

integral
integral
no integral

少し読みやすくなったかしら。

[コンパイラ]

  • g++ (GCC) 4.7.0 20111210 (experimental)