我正在尝试建立一个系统,其中从GuiObject类派生的GUI对象可以注册一个Serialiser和Deserialiser,以便它们可以仅基于类别名对XML文件进行序列化/反序列化。例如:
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:
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);
行收到此错误:
error C2064: term does not evaluate to a function taking 2 arguments
所以我想知道如何延迟传入对象以调用成员函数,指定要在调用函数的同时使用的对象。我&#39已经盯着这一段暂时没有用了。
干杯。
答案 0 :(得分:0)
你需要指明类对象的副本,因为你想调用绑定,就像:
Button* btn = new Button();
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, btn, _1, _2));
如果要为此类对象副本创建绑定
,也可以使用this
指针
答案 1 :(得分:0)
我可以看到两个错误:
首先定义一个带有单个参数的函数,但是尝试用两个参数调用它:
// Single argument of type ticpp::Element*
typedef boost::function<void(ticpp::Element*)> serialisation_function;
// Call with two arguments:
serialisation_func(object, element);
// You probably meant:
typedef boost::function<void(gui_object_ptr, ticpp::Element*)> serialisation_function;
其次,您没有考虑到您的函数是成员函数。这意味着它实际上采用了第三个参数this
(在第一个位置)。您应该检查这是否应该是成员函数,但我认为您的理解存在错误。
// From your code I am not sure what [serial_instance] should be.
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, [serial_instance] , _1, _2));