2012-02-20 89 views
0

我试图建立一个系统,其中从GuiObject类派生的GUI对象可以注册一个串行器和反串行器,以便它们可以仅基于一个XML文件序列化/反序列化到XML文件/类别别名。例如:使用boost的成员函数绑定

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:

error C2064: term does not evaluate to a function taking 2 arguments 

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);线得到这个错误所以我想知道如何延迟传入对象以调用成员函数,指定要在调用函数的同时使用的对象。我一直盯着这一段时间无济于事。

干杯。

回答

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)); 
+0

当我用两个参数调用代码时,这是因为我试图澄清,我想要绑定对象以在代码中调用该函数,而不是在您的示例中创建'function'。 '_1'(在构建'serialisation_function'时)应该是调用成员函数的对象。所以我想知道的是如何延迟绑定对象直到函数被调用。我很抱歉,回头看,我的问题可能会更清楚一些。 – Mitch 2012-02-20 10:17:09

+0

虚拟功能听起来很危险,但您可以尝试以下方法,助推文档说它正在工作。首先你的函数需要两个参数:'typedef boost :: function serialisation_function;'然后绑定它而不做任何特殊的事情:'serialisation_function serialiserFunc(&Button :: WriteElement);'。我没有测试对不起,现在没有时间。 – 2012-02-20 10:22:45

+0

谢谢!这已经停止了这个错误。 – Mitch 2012-02-20 10:29:08

0

您需要指明类对象的副本,至极要拨打绑定,水木清华这样的:

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

也可以使用this指针,如果你想创建该类对象复制结合

+0

我的问题是 - 我将如何延迟指示哪个对象我想调用函数? – Mitch 2012-02-20 10:18:37

+0

正如在我的示例中,您将boost :: bind指针中的第二个参数传递给类对象的副本。 – Olympian 2012-02-20 10:31:31

+0

我认为你误解了我的问题 - 请参阅J.N.的最后一条评论,以澄清我想要做的事情。 – Mitch 2012-02-20 10:37:57

相关问题