Template Aliases すごい

なぜ、今まで気づかなかったんだ。

[ソース]

#include <type_traits>


template<typename T>
using add_pointer = typename std::add_pointer<T>::type;

template<typename T>
using add_const = typename std::add_const<T>::type;

template<typename T>
using remove_const = typename std::remove_const<T>::type;


template<typename T>
void
func(){
    static_assert(std::is_same<typename std::add_pointer<typename std::add_const<T>::type>::type, T const*>::value, "");
    static_assert(std::is_same<add_pointer<add_const<T>>, T const*>::value, "");
}

int
main(){
    static_assert(std::is_same<std::add_pointer<int>::type, int*>::value, "");
    static_assert(std::is_same<add_pointer<int>, int*>::value, "");

    static_assert(std::is_same<std::add_const<int>::type, int const>::value, "");
    static_assert(std::is_same<add_const<int>, int const>::value, "");

    static_assert(std::is_same<std::add_pointer<std::add_const<int>::type>::type, int const*>::value, "");
    static_assert(std::is_same<add_pointer<add_const<int>>, int const*>::value, "");

    static_assert(std::is_same<remove_const<int const>, int>::value, "");
    
    func<int>();
    return 0;
}

すばらしい。

[コンパイラ]

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