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

C++ c++;将函数本身作为参数传递,c++,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(

我有一个容器类,它在一个具有类似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 ); }
类Obj{
double getA(){return m_a;}
double getB(){return m_b;}
....
双m_a,m_b。。。;
}
类容器{
地图m_objs;
getA(inti){返回m_objs[i].getA();}
getB(inti){返回m_objs[i].getB();}
}
类用户{
康奈尔·穆康特;
getA(inti){返回m_cont.getA(i);}

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

在这种情况下,您需要传递的对象是指向成员函数的指针:

您还可以将其添加到
Obj

double get(double (Obj::*what)()) {
  return (this->*what)();
}
要使
容器
用户
更一致,请执行以下操作:

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

更好的处理方法是让容器有一个
get()
,它返回
对象&
,并让调用方确定要在返回的对象上调用哪个getter。这似乎是一个很好的开始。谢谢SamI,我认为您可以使用设计模式:Factory模式。这可以帮助类的用户避免使用长链的构造函数。
class Container {
  // ...
  get(int i, double (Obj::*what)()) { return m_objs[i].get(what); }
};