-
Pointer conversion
I'm simulating the .Net delegates.
Currently it only supports non-void return types and two arguments (because that's what I currently need). It consists of two template classes, one for normal functions and one for member functions:
Code:
// Pointer to any global or static 2-arg function
template <typename RET, typename ARG1, typename ARG2>
class two_arg_fxn_ptr
{
protected:
// void * to allow for other pointer types in derived classes
void *ptr;
two_arg_fxn_ptr()
: ptr(0)
{
}
public:
typedef RET (*ptr_type)(ARG1, ARG2);
explicit two_arg_fxn_ptr(ptr_type p)
{
ptr = reinterpret_cast<void *>(p);
}
virtual RET call(ARG1 a1, ARG2 a2)
{
ptr_type p = reinterpret_cast<ptr_type>(ptr);
return (*p)(a1, a2);
}
RET operator ()(ARG1 a1, ARG2 a2)
{
return call(a1, a2);
}
};
// Pointer to any 2-arg member function.
template <typename OBJ, typename RET, typename ARG1, typename ARG2>
class two_arg_member_fxn_ptr
: public two_arg_fxn_ptr<RET, ARG1, ARG2>
{
OBJ *obj;
public:
typedef RET (OBJ::*ptr_type)(ARG1, ARG2);
two_arg_member_fxn_ptr(OBJ *o, ptr_type p)
: obj(o)
{
ptr = reinterpret_cast<void *>(p);
}
virtual RET call(ARG1 a1, ARG2 a2)
{
ptr_type p = reinterpret_cast<ptr_type>(ptr);
return (obj->*p)(a1, a2);
}
};
You see that the member function class derives from the other to allow for storage of both in a single container.
The normal version compiles fine, but the member function version fails at the two red lines with an impossible-conversion error. VC++, cryptic as always, says something about "there is no context in which this conversion would be possible".
Which is really confusing me...