2012-02-20 2 views
0

Я пытаюсь настроить систему, в которой объекты GUI, полученные из класса GuiObject, могут регистрировать Сериализатор и Deserialiser, чтобы они могли быть сериализованы/десериализованы в/из файла XML, основанного исключительно на class alias. Например:Связывание функции функции с помощью boost

class Button : public GuiObject 
{ 
    // ... 
}; 

Button может выглядеть в XML:

<button> 
    [...] 
</button> 

Так что идея состоит в том, что клиентский код может зарегистрировать serialiser и deserialiser для 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:

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 

Итак, Я хотел бы знать, как отложить передачу объекта, чтобы вызвать функцию-член, указав объект, который будет использоваться одновременно с вызовом функции. Я смотрел на это какое-то время, но безрезультатно.

Cheers.

ответ

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

Когда я вызывал код с двумя параметрами, это было потому, что я пытался уточнить, что я хотел привязать объект к вызову функции в этой точке кода, а не к созданию «функции», как в вашем примере. Предполагается, что '_1' (во время построения' serialisation_function') является объектом вызова функции-члена. Поэтому я хотел бы знать, как отложить привязку объекта до вызова функции. Прошу прощения, оглядываясь назад, мой вопрос мог быть немного яснее. – Mitch

+0

Звучит опасно с помощью виртуальной функции, но вы можете попробовать следующее, чтобы увеличить документы, говорят, что они работают. Сначала у вас есть две функции: typedef boost :: function serialisation_function ;, затем привяжите его, не делая ничего особенного: 'serialisation_function serialiserFunc (& Button :: WriteElement);'. Я не испытал извинения, сейчас у меня нет времени. –

+0

Спасибо! Это остановило ошибку. – Mitch

0

Вы должны указать экземпляр класса-объекта, которым вы хотите назвать обязательными, чего-л, как:

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

также вы можете использовать this указатель, если вы хотите создать привязку для этого объекта экземпляра класса

+0

Мой вопрос: как я могу отложить указание, на какой объект я хочу называть функцию? – Mitch

+0

Как и в моем примере, вы передаете второй параметр в boost :: bind pointer для копирования объекта класса. – Olympian

+0

Я думаю, что вы не понимаете мой вопрос - пожалуйста, см. Последний комментарий J.N., чтобы уточнить, что я пытаюсь сделать. – Mitch

Смежные вопросы