我试图建立一个系统,其中从GuiObject类派生的GUI对象可以注册一个串行器和反串行器,以便它们可以仅基于一个XML文件序列化/反序列化到XML文件/类别别名。例如:使用boost的成员函数绑定
class Button : public GuiObject
{
// ...
};
Button
可能是这样的XML:
<button>
[...]
</button>
这样的想法是,客户端代码可以使用的占位符注册一个GuiObject
衍生物一个串行器及解串器反对呼吁功能:
typedef boost::function<void(ticpp::Element*)> serialisation_function;
// ...
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, _1, _2));
GuiObjectXmlSerialiser buttonSerialiser("button", serialiserFunc);
guiObjectXmlFactory.registerSerialiser(buttonSerialiser);
Button::WriteElement
样子:
virtual void WriteElement(ticpp::Element* element) const;
GuiObjectXmlSerialiser.h:
typedef boost::function<void(ticpp::Element*)> serialisation_function;
// Serialises a GuiObject via a creation and serialisation function, storing
// a class name to differentiate it between others.
class GuiObjectXmlSerialiser
{
public:
GuiObjectXmlSerialiser(const std::string& class_alias,
serialisation_function serialisation_func);
void serialise(gui_object_ptr object, ticpp::Element* element);
private:
std::string class_alias;
serialisation_function serialisation_func;
};
GuiObjectXmlSerialiser.cpp:
error C2064: term does not evaluate to a function taking 2 arguments
:
GuiObjectXmlSerialiser::GuiObjectXmlSerialiser(const std::string& class_alias,
serialisation_function serialisation_func)
: class_alias(class_alias)
, serialisation_func(serialisation_func)
{
}
void GuiObjectXmlSerialiser::serialise(gui_object_ptr object, ticpp::Element* element)
{
serialisation_func(object, element);
}
目前,我在serialisation_func(object, element);
线得到这个错误所以我想知道如何延迟传入对象以调用成员函数,指定要在调用函数的同时使用的对象。我一直盯着这一段时间无济于事。
干杯。
当我用两个参数调用代码时,这是因为我试图澄清,我想要绑定对象以在代码中调用该函数,而不是在您的示例中创建'function'。 '_1'(在构建'serialisation_function'时)应该是调用成员函数的对象。所以我想知道的是如何延迟绑定对象直到函数被调用。我很抱歉,回头看,我的问题可能会更清楚一些。 – Mitch 2012-02-20 10:17:09
虚拟功能听起来很危险,但您可以尝试以下方法,助推文档说它正在工作。首先你的函数需要两个参数:'typedef boost :: function serialisation_function;'然后绑定它而不做任何特殊的事情:'serialisation_function serialiserFunc(&Button :: WriteElement);'。我没有测试对不起,现在没有时间。 –
2012-02-20 10:22:45
谢谢!这已经停止了这个错误。 – Mitch 2012-02-20 10:29:08