C++使用指针 - 成员函数的能力有限。我需要一些能让我动态选择回调成员函数的东西,以便使用来自TinyXML2库的XMLNode::Accept(XMLVisitor *visitor)
方法的访问者模式。如何解决C++指针 - 成员函数限制
要使用XMLNode::Accept()
,我必须使用实现XMLVisitor
接口的类来调用它。因此:
typedef bool (*Callback)(string, string);
class MyVisitor : public tinyxml2::XMLVisitor {
public:
bool VisitExit(const tinyxml2::XMLElement &e) {
callback(e.Name(), e.GetText());
}
Callback callback;
}
这工作得很好,如果我的来电者是不是该想用它自己的方法作为一个回调函数一个(以便它可以访问类变量)的对象。例如,这个作品:
bool myCallBackFunc(string e, string v) {
cout << "Element " << e << " has value " << v << endl;
return true;
}
int main(...) {
tinyxml2::XMLDocument doc;
doc.LoadFile("somefile.xml");
MyVisitor visit;
visit.callback = myCallBackFunc;
doc.Accept(&visit);
}
但是,在我的用例中,解析是在一个类的方法内完成的。我有多个具有类似但独特的类的应用程序。我只想使用一个通用的类,而不是让访问者类对每个类的内部都有独特的知识,这些知识将称为它。
因此,如果回调函数是每个调用类中的一个方法,这样我就可以影响从该调用类实例化的对象的内部状态,这将很方便。
顶层:我有5个服务器应用程序与5个不同的贸易伙伴交谈,他们都发送XML响应,但每个服务器应用程序都有足够的不同,每个服务器应用程序都有一个对该贸易伙伴唯一的类。我试图遵循良好的面向对象和干型设计,并避免额外的类具有独特的知识,同时仍然在做基本相同的工作。
这里是我想要回拨的Accept()
的类方法。
ServiceClass::changeState(string elem, string value) {
// Logic which sets member vars based on element found and its value.
}
这里的类方法,它将调用Accept()
走XML:
ServiceClass::processResponse(string xml) {
// Parse XML and do something only if certain elements present.
tinyxml2::XMLDocument doc;
doc.Parse(xml.c_str(), xml.length());
MyVisitor visit;
visit.callback = &changeState; // ERROR. Does not work.
visit.callback = &ServiceClass::changeState; // ERROR. Does not work.
doc.Accept(&visit);
}
什么是简单的方式来获得我想要什么?我可以想象更多具有派生类的类,每种情况都是独一无二的,但是这看起来非常冗长和笨拙。注:为简洁起见,我上面的示例代码没有错误检查,没有空值检查,甚至可能有小错误(例如将const char *
作为字符串处理;-)。
你尝试过std :: bind吗? –