#include "stdafx.h"
#include <xtr1common>
#include <string>
template<typename T, int _Index>
struct IndexedTWrap
{
typedef T type;
static T gettype();
enum{ Index = _Index };
};
struct _GetClass_TypeOrTHelper
{
template<typename T>
static IndexedTWrap<typename T::type, 1> _hasDefineType(IndexedTWrap<typename T::type, 0>*);
template<typename T>
static IndexedTWrap<T /*没有定义时的默认值在这里定义*/, 0> _hasDefineType(...);
};
template<typename T>
struct GetClass_TypeOrT //获取T::type类型
{
typedef decltype(_GetClass_TypeOrTHelper::_hasDefineType<T>(0)) wraptype;
enum { value = wraptype::Index };
typedef typename wraptype::type type;
int view = value;
};
int _tmain(int argc, _TCHAR* argv[])
{
printf("%d %s\n", GetClass_TypeOrT<int>::value, typeid(GetClass_TypeOrT<int>::type).name()); //0 int
printf("%d %s\n", GetClass_TypeOrT<IndexedTWrap<int, 1>>::value, typeid(GetClass_TypeOrT<IndexedTWrap<int, 1>>::type).name()); //1 int
printf("%d %s\n", GetClass_TypeOrT<std::string>::value, typeid(GetClass_TypeOrT<std::string>::type).name()); //0 basic_string<...>
return 0;
}
输出结果0表示未定义了“type”成员,1表示定义了
第二个字符串表示type类型,或者未定义时的默认值
上面代码为了方便用了c++11的decltype,如果是低版本,可用sizeof()实现,但是就没这么方便了
另外对于按名字判断是否存在成员函数,请参看http://blog.chinaunix.net/uid-1720597-id-306773.html