#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_HasMember
{
template<typename T, int(T::*)>
struct matcher;
template<typename T>
static IndexedTWrap<typename T, 1> _hasDefineType(matcher<T, &T::first>*);
template<typename T>
static IndexedTWrap<T /*默认值*/, 0> _hasDefineType(...);
};
template<typename T>
struct GetClass_TypeOrT //获取T::type类型
{
typedef decltype(_GetClass_HasMember::_hasDefineType<T>(0)) wraptype;
enum { value = wraptype::Index };
typedef typename wraptype::type type;
int view = value;
};
template<typename T, typename U>
struct matcher;
int _tmain(int argc, _TCHAR* argv[])
{
printf("%d %s\n", GetClass_TypeOrT<int>::value, typeid(GetClass_TypeOrT<int>::type).name()); //0
printf("%d %s\n", GetClass_TypeOrT<IndexedTWrap<int, 1>>::value, typeid(GetClass_TypeOrT<IndexedTWrap<int, 1>>::type).name()); //0
printf("%d %s\n", GetClass_TypeOrT<std::pair<int, int>>::value, typeid(GetClass_TypeOrT<std::pair<int, int>>::type).name()); //1
return 0;
}
仍然用了decltype,低版本的可以改成sizeof实现