F
Wie wär's denn hiermit:
// Ueberladungen fuer vlt. 0-10 Argumente...
template <typename ReturnT, typename Par1T, typename Par2T>
size_t numArgs( ReturnT (*)(Par1T, Par2T) )
{
return 2;
}
template <typename ReturnT, typename Par1T, typename Par2T, typename Par3T>
size_t numArgs( ReturnT (*)(Par1T, Par2T, Par3T) )
{
return 3;
}
// dto, 0-10 oder so
template <typename FunctionPtrT, typename Par1T, typename Par2T>
void callhelper2( FunctionPtrT f, Par1T p1, Par2T p2 )
{
f(p1, p2);
}
template <typename FunctionPtrT, typename Par1T, typename Par2T, typename Par3T>
void callhelper3( FunctionPtrT f, Par1T p1, Par2T p2, Par3T p3 )
{
f(p1, p2, p3);
}
struct FunctionWrapperBase
{
virtual void call( array& args ) = 0;
virtual ~FunctionWrapperBase() { }
};
template<typename FunctionPtrT>
class FunctionWrapper : public FunctionWrapperBase
{
public:
FunctionWrapper( FunctionPtrT funptr ) : funptr(funptr) { }
void call( array& args )
{
switch(numArgs(funptr)) {
// dto, 0-irgendwas
case 2:
callhelper2(funptr, toType(args[0]), toType(args[1]));
break;
case 3:
callhelper3(funptr, toType(args[0]), toType(args[1]), toType(args[2]));
break;
};
}
private:
FunctionPtrT funptr;
};
// ...
typedef std::map<id_t, FunctionWrapperBase*> FunctionMap;
FunctionMap myfunctions;
// ...
myfunctions[id]->call(myargs);
Könntest auch verschiedene Wrapper basteln und dir von einer Factory den richtigen erzeugen lassen um das switch statement loszuwerden.