C++11新加入的type_traits
头文件提供了模版元编程中常用的type trait基础设施,这些type traits基于编译期间的运算,能够极早提示出程序中的错误。这些type traits的基础就是整形包装器,见之前的博文总结:http://blog.csdn.net/u010487568/article/details/51273920。本文对type traits的部分进行总结和实现。
主类型归类
主要是判断语言提供的基础类型,包括数组、类、enum、union、指针、引用、函数、右值引用、成员函数指针、成员对象指针、void。这些类型归类都是继承自integral_constant
这个整形包装器。下面提供部分实现。
这些基础类型都是基于模版偏特化即可实现,但偏特化需要考虑全面,下面以is_array
说明。
template<class T> struct is_array : std::false_type {};
//偏特化一维数组
template<class T> struct is_array<T[]> : std::true_type {};
//偏特化多维数组
template<class T, std::size_t N> struct is_array<T[N]> : std::true_type {};
其余指针、引用实现相似,不过需要考虑const、volatile等修饰,其中函数还需要考虑const、volatile、noexcept修饰,以及可变参数与可变模版参数两种不同特化及这些组合。
// primary template
template<class>
struct is_function : std::false_type { };
// specialization for regular functions
template<class Ret, class... Args>
struct is_function<Ret(Args...)> : std::true_type {};
// specialization for variadic functions such as std::printf
template<class Ret, class... Args>
struct is_function<Ret(Args......)> : std::true_type {};
// specialization for function types that have cv-qualifiers
template<class Ret, class... Args>
struct is_function<Ret(Args...)const> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...)volatile> :