是否可以从参数访问成员名称

时间:2011-04-06 15:34:34

标签: c++

请考虑此课程:

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之外,我还有其他六个类似的类,并希望有一个父类可以获取七个类中的任何一个的向量,并且可以返回该值的值(或者在实际情况下为多个集合)。选择会员名称。

3 个答案:

答案 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;
  }