使用boost绑定成员函数
Member function binding using boost
我正在尝试建立一个系统,在这个系统中,从GuiObject类派生的GUI对象可以注册序列化程序和反序列化程序,这样它们就可以仅基于类别名在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;
};
GuiObjectXmlSerialise.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
因此我想知道如何延迟传入要调用其成员函数的对象,并在调用函数的同时指定要使用的对象我已经盯着这个看了一段时间,但没有用。
干杯。
我可以看到两个错误:
首先,您定义了一个接受单个参数的函数,但您尝试使用两个参数来调用它:
// 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));
您需要指示类对象的副本,以便调用绑定,smth类似于:
Button* btn = new Button();
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, btn, _1, _2));
如果您想为这个类对象复制创建绑定,也可以使用this
指针
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针