0

我正在尝试建立一个系统,其中派生自 GuiObject 类的 GUI 对象可以注册 Serialiser 和 Deserialiser,以便它们可以仅基于类别名序列化/反序列化到 XML 文件/从 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;

GuiObjectXmlSerializer.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;
};

GuiObjectXmlSerializer.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

所以我想知道如何延迟传入对象以调用成员函数,指定要在调用函数的同时使用的对象。我已经盯着这个有一段时间了,但无济于事。

干杯。

4

2 回答 2

0

您需要指出类对象的副本,因为您要调用绑定,例如:

Button* btn = new Button();
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, btn, _1, _2));

this如果要为此类对象副本创建绑定,也可以使用指针

于 2012-02-20T10:10:17.523 回答
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));
于 2012-02-20T10:12:53.630 回答