Question

I'm trying to set up a system where GUI objects that derive from a GuiObject class can register a Serialiser and Deserialiser so that they can be serialised/deserialised to/from an XML file based solely on a class alias. For example:

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

Button might look like this in XML:

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

So the idea is that the client code can register a serialiser and deserialiser for a GuiObject derivative, using a placeholder for the object to call the function on:

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 looks like:

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);
}

Currently, I'm getting this error at the serialisation_func(object, element); line:

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

So I'd like to know how to delay passing in the object to call the member function on, specifying the object to use at the same time as calling the function. I've been staring at this for a while now to no avail.

Cheers.

Was it helpful?

Solution

I can see two errors:

First you define a function that takes a single argument, but you try to call it with two arguments:

// 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;

Second, you don't take into account that your function is a member function. That means it's actually taking a third parameter, this (in first position). You should check whether this should be a member function or not, but I think there's a mistake in your understanding.

// From your code I am not sure what [serial_instance] should be.
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, [serial_instance] , _1, _2));

OTHER TIPS

You need to indicate copy of class-object, for wich you want to call binding, smth like:

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

also you can use this pointer, if you want to create binding for this class object copy

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top