我正在尝试建立一个系统,其中派生自GuiObject类的GUI对象可以注册Serialiser和Deserialiser,这样它们就可以仅仅基于类别名被序列化/反序列化到/从一个XML文件。例如:
class Button : public GuiObject
{
// ...
};在XML中,Button可能如下所示:
<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;GuObjectXmlSerialiser.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所以,,我想知道如何延迟传入对象来调用成员函数,指定在调用函数的同时使用的对象。,我已经盯着这个对象已经有一段时间了,但是没有结果。
干杯。
发布于 2012-02-20 10:12:53
我看到两个错误:
首先,定义一个接受单个参数的函数,但尝试用两个参数调用它:
// 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));发布于 2012-02-20 10:10:17
您需要指示类对象的副本,对于要调用绑定的类型,smth如下:
Button* btn = new Button();
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, btn, _1, _2));此外,如果要为此类对象副本创建绑定,也可以使用this指针。
https://stackoverflow.com/questions/9359080
复制相似问题