Привязка функции-члена с использованием boost - PullRequest
0 голосов
/ 20 февраля 2012

Я пытаюсь настроить систему, в которой объекты GUI, производные от класса GuiObject, могут регистрировать Serialiser и Deserialiser, чтобы их можно было сериализовать / десериализовать в / из файла 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;

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

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

Приветствие.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Я вижу две ошибки:

Сначала вы определяете функцию, которая принимает один аргумент, но вы пытаетесь вызвать ее с двумя аргументами:

// 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 голосов
/ 20 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...