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; }
すばらしい。