如何将带有参数包的函数传递给带有参数包的函数
How to pass a function with parameter pack to a function with parameter pack
我正在处理 C++14 项目,但我不知道如何将带有参数包的函数传递给另一个带有参数包的函数。
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;
}
如您所见,在函数doAsyncRpc
中调用了func
。 args
用于初始化参数req
,callback
和args2
用于传递func
。
Callback
是一个函数,Args2
是它的参数。
有点复杂...
总之,我不知道如何设计函数doAsyncRpc
,使其可以接受两个带参数包的函数
您不能从一个调用的参数中推断出两个包,因此您必须至少 Args...
包装在一个元组中,但两者都做可能更容易。
然后您需要将其他参数与这些参数一起放入元组中。
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;
}
我正在处理 C++14 项目,但我不知道如何将带有参数包的函数传递给另一个带有参数包的函数。
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;
}
如您所见,在函数doAsyncRpc
中调用了func
。 args
用于初始化参数req
,callback
和args2
用于传递func
。
Callback
是一个函数,Args2
是它的参数。
有点复杂...
总之,我不知道如何设计函数doAsyncRpc
,使其可以接受两个带参数包的函数
您不能从一个调用的参数中推断出两个包,因此您必须至少 Args...
包装在一个元组中,但两者都做可能更容易。
然后您需要将其他参数与这些参数一起放入元组中。
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;
}