Dies ist eine alte Version des Dokuments!
Method-Function-Pointer
#include <iostream>
template<typename R, typename M>
class MemberFunction
{
public:
MemberFunction(R (M::*method)(), M* instance):
_method(method),
_instance(instance)
{
}
R operator()()
{
return (_instance->*_method)(); // ->* pointer-to-member selection operator
}
private:
R (M::*_method)();
M* _instance;
};
template<typename R, typename M>
MemberFunction<R, M> createMemberFunction(R (M::*method)(), M* instance)
{
return MemberFunction<R, M>(method, instance);
}
struct Test
{
void test()
{
std::cout << "blubb" << std::endl;
}
};
int main()
{
Test t;
createMemberFunction(&Test::test, &t)();
return 0;
}
</code>
<code cpp>
#include <iostream>
template <typename Sig>
class MemberFunctionImplBase;
template <typename R, typename A>
class MemberFunctionImplBase<R(A)>
{
public:
typedef R ReturnType;
typedef A ArgumentType;
virtual ~MemberFunctionImplBase()
{};
virtual MemberFunctionImplBase<R(A)>* clone() = 0;
virtual R operator()(A a) = 0;
};
template <typename R, typename M, typename A>
class MemberFunctionImpl: public MemberFunctionImplBase<R(A)>
{
public:
MemberFunctionImpl(R (M::*method)(A), M* instance):
_method(method),
_instance(instance)
{}
MemberFunctionImplBase<R(A)>* clone()
{
return new MemberFunctionImpl(_method, _instance);
}
R operator()(A a)
{
return (_instance->*_method)(a);
}
private:
R (M::*_method)(A);
M* _instance;
};
template <typename Sig>
class MemberFunction
{
public:
typedef typename MemberFunctionImplBase<Sig>::ReturnType ReturnType;
typedef typename MemberFunctionImplBase<Sig>::ArgumentType ArgumentType;
MemberFunction():
_f(0)
{}
MemberFunction(MemberFunctionImplBase<Sig>* f):
_f(f)
{}
MemberFunction(const MemberFunction& other)
{
_f = other._f->clone();
}
~MemberFunction()
{
delete _f;
}
ReturnType operator()(ArgumentType a)
{
return (*_f)(a);
}
MemberFunction<Sig>& operator=(const MemberFunction<Sig>& other)
{
if (_f) delete _f;
_f = other._f->clone();
return *this;
}
private:
MemberFunctionImplBase<Sig>* _f;
};
template<typename R, typename M, typename A>
MemberFunction<R(A)> createMemberFunction(R (M::*method)(A), M* instance)
{
return MemberFunction<R(A)>(new MemberFunctionImpl<R, M, A>(method, instance));
};
struct X
{
void x(int j)
{
std::cout << "j = " << j << std::endl;
}
};
int main()
{
X x;
MemberFunction<void(int)> xf = createMemberFunction(&X::x, &x);
(xf)(42);
return 0;
}