Question

I currently have this macro

#define bind(OBJECT, ROLE) \
assert( sizeof(*ROLE) == 1 ); \
ROLE = reinterpret_cast<decltype(ROLE)>(OBJECT);

It is causing some name clashing issues so I'd like to move this into a templated function like

template<typename T1, typename T2>
void bind(T1 obj, T2 r) {
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
};

However, I suspect that this is not possible, but would like to be confirmed on this? In order to change r, I must have a pointer to a pointer?

Was it helpful?

Solution

You will need at least need a reference:

template<typename T1, typename T2>
void bind(T1 obj, T2& r)
{
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
}

Another option is to use a template conversion operator. Then you can call with the syntax:

ROLE = bind(OBJ);

The code would be more-or-less like this:

template<typename T1> class auto_converter
{
    const T1& value;
public:
    auto_converter(const T1& v) : value(v) {}

    // template conversion operator
    template<typename T2>
    operator T2() const
    {
        assert(sizeof (*T2()) == 1);
        return reinterpret_cast<T2>(value);
    }
};

template<typename T1>
autoconverter<T1> bind(const T1& obj) { return obj; }

OTHER TIPS

Declare r as reference in order to change it:

template<typename T1, typename T2>
void bind(T1 obj, 
          T2 &r) //<-- here 
{
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
};
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top