GuiObjectクラスから派生したGUIオブジェクトがシリアライザとデシリアライザを登録できるシステムを設定しようとしています。シリアライザとデシリアライザは、クラスエイリアス。たとえば:ブーストを使用したメンバ関数のバインド
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);
ラインでこのエラーを取得していますだから私は、メンバー関数を呼び出すためにオブジェクトを渡すのを遅らせる方法を知りたいと思います。関数を呼び出すのと同時にオブジェクトを指定してください。私はしばらくの間これを見つめていませんでした。
乾杯。
2つのパラメータでコードを呼び出すと、コード内のその時点で関数を呼び出すようにオブジェクトをバインドし、例のように 'function'を作成するのではなく、バインドする必要があることを明確にしようとしていたためです。 '_1'(' serialisation_function'の構築中)は、メンバ関数を呼び出すオブジェクトであると考えられます。だから私が知りたいのは、関数が呼び出されるまでオブジェクトのバインドを遅らせる方法です。振り返ってみると、私の質問は少しはっきりしていた可能性があります。 – Mitch
仮想関数では危険ですが、次のように試してみてください。最初に、あなたの関数に 'typedef boost :: function serialisation_function;という2つのパラメータをとり、特別な処理をせずにバインドします:' serialisation_function serialiserFunc(&Button :: WriteElement); '。私は申し訳ありませんが、今は時間がないことをテストしませんでした。 –
ありがとう!これにより、エラーが停止しました。 – Mitch