I'm working on creating a simple reflector in C++11, it stores function pointers of instances functions as:
static std::unordered_map<std::string, std::pair<void(EmptyClass::*)(void), int>>* methods; template<typename ClassType, typename returnType, typename... Args> static void RegistFunction(std::string name, returnType(ClassType::* func)(Args... args)) { (*methods)[name] = std::make_pair((void(EmptyClass::*)())func, sizeof...(Args)); } template<typename ReturnType, typename ClassType, typename... Args> static ReturnType ExecuteFunction(ClassType* object, std::string name, Args... args) { if (object == NULL) return; ReturnType(ClassType:: * func)(Args...) = (ReturnType(ClassType::*)(Args...))(*methods)[name].first; return (object->*func)(std::forward<Args>(args)...); } But when I want to call ExecuteFunction, the number of arguments may be more than the number that function pointer actually accepts. So I need to remove some arguments from the tail of argument list, but it seems I can only remove from head.
template<typename ReturnType, typename ClassType, typename Arg, typename... Args> static ReturnType ExecuteFunction(ClassType* object, std::string name, Arg arg, Args... args) { if (sizeof...(Args) + 1 > (*methods)[name].second) { return ExecuteFunction<ReturnType>(std::forward<ClassType*>(object), std::forward<std::string>(name), std::forward<Args>(args)...); } if (object == NULL) return; ReturnType(ClassType:: * func)( Arg, Args...) = (ReturnType(ClassType::*)(Arg, Args...))(*methods)[name].first; return (object->*func)(std::forward<Arg>(arg), std::forward<Args>(args)...); } Is there any solution to remove arguments at the tail of variadic method template?
std::tupleis in the standard library for a reason. On the other hand, if you don't insist on being fully generic, you can enumerate all possible functions and switch on them.