I'm working on a C 14 project and I don't know how to pass a function with parameter pack to another with parameter pack.
template <typename F, typename... Args, typename Callback, typename ... Args2>
bool doAsyncRpc(F func,
Callback callback,
const char* routeType,
Args&&... args, Args2&&... args2) {
Request req;
SetReqValue(&req, std::forward<Args>(args)...);
func(routeType, req, callback, std::forward<Args2>(args2)...);
return true;
}
As you see, func
is called in the function doAsyncRpc
. args
is used to initialize the parameter req
, callback
and args2
are used to pass the func
.
Callback
is a function and Args2
is its parameters.
It's kind of complicated...
In a word, I don't know how to design the function doAsyncRpc
so that it could accept two functions with parameter packs.
CodePudding user response:
You can't deduce two packs from the arguments to a call, so you'll have to wrap at least Args...
in a tuple, but it's probably easier to do both.
You then need to shove your other arguments into tuples with those.
template <typename F, typename... Args, typename Callback, typename ... Args2>
bool doAsyncRpc(F func,
Callback callback,
const char* routeType,
std::tuple<Args&&...> args,
std::tuple<Args2&&...> args2) {
Request req;
std::apply(SetReqValue, std::tuple_cat(std::make_tuple(&req), args));
std::apply(func, std::tuple_cat(std::make_tuple(routeType, req, callback), args2));
return true;
}