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

Is it possible to access member name from parameter

本文关键字:成员 访问 参数 是否      更新时间:2023-10-16

请考虑这个类:

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之外,我还有其他六个类似的类,并希望有一个父类,它将接受七个类中的任何一个的向量,并且可以返回所选成员名的值(或在实际情况下是多集)。

没有

一种直接的方法可以在C++中做你想做的事情,尽管有一些合理的反射框架尝试。 您还可以查看此处:如何向C++应用程序添加反射?有关反思的其他评论。 但是,我建议不要有 50 个成员变量,而只需使用一个私有std::hashmap并使用std::string密钥。 然后,您可以轻松地将字符串参数作为键传递,以便直接查找。

当然,这假设您的所有 50 个成员都属于同一类型,并且可能不适合您的应用程序。 但是,接受我的观点,即:做一点不同的事情。

您可以使用

X宏技术将变量映射到包含您的a_n的容器(例如std::deque)的索引。您可能应该在末尾添加一个额外的条目,您可以使用它来获取所需的容器大小。

听起来你可能想要一个指向成员的指针,尽管最好更改为更灵活的对象表示形式,例如可区分联合数组 ( boost::variant ) 或 C++11 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;
  }

用作

vector< A > vector_a;
vector< string > vector_a_a1 = A::getAttrib(vector_a, &A::a1);