#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, const char*(T::*)() const>
struct matcher;
template<typename T>
static IndexedTWrap<typename T, 1> _hasDefineType(matcher<T, &T::c_str>*);
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;
};
int _tmain(int argc, _TCHAR* argv[])
{
decltype(&std::string::c_str)* pstr;
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::string>::value, typeid(GetClass_TypeOrT<std::string>::type).name()); //1
return 0;
}
仍然用了decltype,如果需要在低版本使用,请参考http://blog.chinaunix.net/uid-1720597-id-306773.html