c ++将函数本身作为参数传递

时间:2016-12-19 11:58:02

标签: c++

我有一个容器类,它在地图中包含具有类似getter函数的各种对象。它本身包含在使用该数据的类中。所以,我在这里有一些看似不理想的链条。

class Obj {
    double getA() { return m_a; }
    double getB() { return m_b; }
    ....

    double m_a, m_b, ...;
}

class Container {
    map<long, Obj> m_objs;

    getA( int i ) { return m_objs[i].getA(); }
    getB( int i ) { return m_objs[i].getB(); }
}

class User {
    Conainer m_cont;
    getA( int i ) { return m_cont.getA( i ); }

是否有更通用的方法通过以某种方式将调用函数传递给它来获取对象值。我承认整个构造与长链似乎并不理想,但在这种情况下它似乎很自然,因为我有某种对象树,并将信息向上传递到顶部节点,我不知道如何避免这种情况。但如果有任何更好的方法来解决这个问题的建议,我很高兴听到它

1 个答案:

答案 0 :(得分:2)

在此场景中需要传递的对象是指向成员函数的指针

class Obj {
  // ...

  double getA() {
    return a;
  }

  double getB() {
    return b;
  }

private:
  double a;
  double b;
};

class Container {
  // ...
  get(int i, double (Obj::*what)()) { return (m_objs[i].*what)(); }
};

class User {
  Container m_cont;
  // ...
  get(int i, double (Obj::*what)()) { return m_cont.get(i, what); }
};

// ...
double myA = user.get(1, &Obj::getA);

您也可以将其添加到Obj

double get(double (Obj::*what)()) {
  return (this->*what)();
}

使ContainerUser更加一致:

class Container {
  // ...
  get(int i, double (Obj::*what)()) { return m_objs[i].get(what); }
};