请考虑此课程:
class A
{
public: //public in this example
string a1;
string a2;
string a3;
string a4;
int a5;
double a6;
(...) plus other 50 member names
multiset<string> getAttrib(const vector(A)& va, string attr)
{
for (vector<string>::const_iterator ci = va.begin; ci != va.end(); ++ci) {
cout << ci->attr << endl; //ERROR
}
};
可以调用成员函数,如:
A a
a.getAttrib(vector_a, "a1");
这会导致错误。 Const class A has no member named 'attr'.
我不想写50个不同的case
语句来实现上述想要的灵活性。
有可能吗?
如果成员名称是私有的,可以使用公共成员函数来执行此操作吗?
除了class A
之外,我还有其他六个类似的类,并希望有一个父类可以获取七个类中的任何一个的向量,并且可以返回该值的值(或者在实际情况下为多个集合)。选择会员名称。
答案 0 :(得分:4)
虽然在那里有一些合理的反思框架尝试,但是没有直接的方法可以在C ++中做你想做的事情。您还可以在此处查看:How can I add reflection to a C++ application?以获取有关反射的其他评论。但是,我建议您不要使用50个成员变量,而只需使用一个私有std::hashmap
并使用std::string
密钥。然后,您可以轻松地将字符串参数作为键进行直接查找。
当然,这假设您的所有50个成员属于同一类型,并且可能不适合您的应用程序。但是,请注意我的观点:这样做会有所不同。
答案 1 :(得分:2)
您可以使用X
macro技术将变量映射到包含std::deque
的容器索引(例如a_n
)。您可能应该在末尾添加一个额外的条目,您可以使用它来获取所需的容器大小。
答案 2 :(得分:0)
听起来你可能想要一个指向成员的指针,尽管改为更灵活的对象表示可能更好,例如一系列有区别的联合(boost::variant
)或C ++ 11 { {1}}。
无论如何,使用指向成员的指针,你可以拥有
std::tuple
用作
template< typename Attr_Type >
static vector< Attr_Type > getAttrib(const vector<A>& va, Attr_Type A:: *attr)
{
vector< Attr_Type > ret;
for (vector<A>::const_iterator ci = va.begin(); ci != va.end(); ++ci) {
cout << ci->*attr << endl;
ret.push_back( ci->*attr );
}
return ret;
}