c++11::std::is_same/decay
#include <type_traits> std::is_same 判断类型是否一致 通过std::is_same即可判断两个类型是否一样,特别在模板里面,在不清楚模板的参数时,此功能可以对一些特定的参数类型进行特殊的处理。 std::is_same可以判断两种类似是否一样,那么用在模板里就是利器了,本位一开始提到的那个问题就可以这样写: #include <iostream> template<typename TYPE> typeCheck(TYPE data) { if(std::is_same<TYPE,int>::value) { std::cout<<"int type"; //do something int } else { //......... } }
std::is_same的判断是很严格的! typedef int integer_type; struct A { int x, y; }; struct B { int x, y; }; typedef A C; int main() { std::cout << std::boolalpha; std::cout << "is_same:" << std::endl; std::cout << "int, const int: " << std::is_same<int, const int>::value << std::endl;//false std::cout << "int, int&: " << std::is_same<int, int&>::value << std::endl;//false std::cout << "int, const int&: " << std::is_same<int, const int&>::value << std::endl;//false std::cout << "int, integer_type: " << std::is_same<int, integer_type>::value << std::endl;//true std::cout << "A, B: " << std::is_same<A, B>::value << std::endl;//false std::cout << "A, C: " << std::is_same<A, C>::value << std::endl;//true std::cout << "signed char, std::int8_t: " << std::is_same<signed char, std::int8_t>::value << std::endl;//true system("pause"); }
std::decay 退化类型的修饰。 各种引用的修饰去掉,把cosnt int&退化为int,这样就能通过std::is_same正确识别出加了引用的类型了 #include <iostream> #include <type_traits> template <typename T, typename U> struct decay_equiv : std::is_same<typename std::decay<T>::type, U>::type {}; int main() { std::cout << std::boolalpha << decay_equiv<int, int>::value << '\n' //true << decay_equiv<int&, int>::value << '\n' //true << decay_equiv<int&&, int>::value << '\n' //true << decay_equiv<const int&, int>::value << '\n' //true << decay_equiv<int[2], int*>::value << '\n' //true << decay_equiv<int(int), int(*)(int)>::value << '\n'; //true }