:
template<typename T>
class TypeHasName
{
private:
typedef char (&YesType)[2];
typedef char (&NoType)[1];
struct Base { int name; };
struct Derived : T, Base { Derived(); };
template<typename U, U> struct Dummy;
template<typename U>
static YesType Test(...);
template<typename U>
static NoType Test(Dummy<int Base::*, &U::name>*);
public:
enum { Value = (sizeof(Test<Derived>(0)) == sizeof(YesType)) };
};
#include <string>
#include <iostream>
struct HasName { std::string name; };
struct NoName {};
int main()
{
std::cout << "HasName: " << TypeHasName<HasName>::Value << std::endl;
std::cout << "NoName: " << TypeHasName<NoName>::Value << std::endl;
return 0;
}
, T name, Derived name ( T Base). T name, Derived Base.
Derived name, &U::name Test() , SFINAE .