c++ template 判断是否为类类型

/* The following code example is taken from the book
* "C++ Templates - The Complete Guide"
* by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002
*
* (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>

template<typename T>
class IsClassT {
private:
	typedef char One;
	typedef struct { char a[2]; } Two;
	template<typename C> static One test(int C::*);
	template<typename C> static Two test(...);
public:
	enum { Yes = sizeof(test<T>(0)) == 1 };
	enum { No = !Yes };
};


class MyClass {
};

struct MyStruct {
};

union MyUnion {
};

void myfunc()
{
}

enum E { e1 } e;

// check by passing type as template argument
template <typename T>
void check()
{
	if (IsClassT<T>::Yes) {
		std::cout << " IsClassT " << std::endl;
	}
	else {
		std::cout << " !IsClassT " << std::endl;
	}
}

// check by passing type as function call argument
template <typename T>
void checkT(T)
{
	check<T>();
}

int main()
{
	std::cout << "int:     ";
	check<int>();

	std::cout << "MyClass: ";
	check<MyClass>();

	std::cout << "MyStruct:";
	MyStruct s;
	checkT(s);

	std::cout << "MyUnion: ";
	check<MyUnion>();

	std::cout << "enum:    ";
	checkT(e);

	std::cout << "myfunc():";
	checkT(myfunc);
}

http://blog.csdn.net/zhoudaxia/article/category/553198

原文地址:https://www.cnblogs.com/itdef/p/5596349.html