首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用boost的成员函数绑定

使用boost的成员函数绑定
EN

Stack Overflow用户
提问于 2012-02-20 09:48:42
回答 2查看 238关注 0票数 0

我正在尝试建立一个系统,其中派生自GuiObject类的GUI对象可以注册Serialiser和Deserialiser,这样它们就可以仅仅基于类别名被序列化/反序列化到/从一个XML文件。例如:

代码语言:javascript
复制
class Button : public GuiObject
{
    // ...
};

在XML中,Button可能如下所示:

代码语言:javascript
复制
<button>
    [...]
</button>

因此,客户端代码可以为GuiObject派生程序注册序列化器和反序列化器,使用对象的占位符来调用上的函数。

代码语言:javascript
复制
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看起来像:

代码语言:javascript
复制
virtual void WriteElement(ticpp::Element* element) const;

GuObjectXmlSerialiser.h:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);行中得到了这个错误:

代码语言:javascript
复制
error C2064: term does not evaluate to a function taking 2 arguments

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

干杯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-20 10:12:53

我看到两个错误:

首先,定义一个接受单个参数的函数,但尝试用两个参数调用它:

代码语言:javascript
复制
// 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 (位于第一个位置)。您应该检查这是否应该是一个成员函数,但是我认为在您的理解中存在一个错误。

代码语言:javascript
复制
// From your code I am not sure what [serial_instance] should be.
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, [serial_instance] , _1, _2));
票数 0
EN

Stack Overflow用户

发布于 2012-02-20 10:10:17

您需要指示类对象的副本,对于要调用绑定的类型,smth如下:

代码语言:javascript
复制
Button* btn = new Button();
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, btn, _1, _2));

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9359080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档