Я пытаюсь настроить систему, в которой объекты 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.
Когда я вызывал код с двумя параметрами, это было потому, что я пытался уточнить, что я хотел привязать объект к вызову функции в этой точке кода, а не к созданию «функции», как в вашем примере. Предполагается, что '_1' (во время построения' serialisation_function') является объектом вызова функции-члена. Поэтому я хотел бы знать, как отложить привязку объекта до вызова функции. Прошу прощения, оглядываясь назад, мой вопрос мог быть немного яснее. – Mitch
Звучит опасно с помощью виртуальной функции, но вы можете попробовать следующее, чтобы увеличить документы, говорят, что они работают. Сначала у вас есть две функции: typedef boost :: function serialisation_function ;, затем привяжите его, не делая ничего особенного: 'serialisation_function serialiserFunc (& Button :: WriteElement);'. Я не испытал извинения, сейчас у меня нет времени. –
Спасибо! Это остановило ошибку. – Mitch