您需要一个帮助类,您的模板化 get() 成员函数可以使用。助手类可以在命名空间范围内。
#include <iostream>
#include <string>
using std::string;
using std::cout;
struct Uid {
typedef int type;
};
struct Name {
typedef string type;
};
struct Age {
typedef int type;
};
// Helper class that can be specialized to get different members of People.
template <class P, class U> struct PeopleGet;
template <class T1, class T2, class T3>
class People {
public:
People(
typename T1::type const& val1,
typename T2::type const& val2,
typename T3::type const& val3
)
: val1(val1),
val2(val2),
val3(val3)
{
}
template <class U> typename U::type get()
{
return PeopleGet<People<T1,T2,T3>,U>::get(*this);
}
private:
typename T1::type val1;
typename T2::type val2;
typename T3::type val3;
template <class P,class U> friend class PeopleGet;
};
template <class T1,class T2,class T3>
struct PeopleGet<People<T1,T2,T3>,T1> {
static typename T1::type get(const People<T1,T2,T3> &people) { return people.val1; }
};
template <class T1,class T2,class T3>
struct PeopleGet<People<T1,T2,T3>,T2> {
static typename T2::type get(const People<T1,T2,T3> &people) { return people.val2; }
};
template <class T1,class T2,class T3>
struct PeopleGet<People<T1,T2,T3>,T3> {
static typename T3::type get(const People<T1,T2,T3> &people) { return people.val3; }
};
int main()
{
People<Uid, Name, Age> people(5,"name",47);
cout << people.get<Uid>() << "\n";
cout << people.get<Name>() << "\n";
cout << people.get<Age>() << "\n";
return 0;
}