// I can't change this function!
template<typename Function, typename... Args>
void RpcWriteKafka(Function func, Args&&... args) {
func(std::forward<Args>(args)...);
}
// I can change this one if necessary.
template<typename FUNC, typename... Args, typename CALLBACK, typename... CArgs>
void doJob(std::tuple<CALLBACK, CArgs&&...> tp, FUNC func, Args&&... args) {
// SetValues(std::forward<Args>(args)...);
std::apply(func, tp);
}
int main() {
doJob(std::make_tuple([](int i){}, 1), RpcWriteKafka, 1);
return 0;
}
如您所見,一些庫提供了模板函式RpcWriteKafka。它需要關于回呼函式(func)及其引數(args...)的引數。
我想定義我自己的函式doJob,它允許我這樣呼叫它doJob(std::make_tuple([](int i){}, 1), RpcWriteKafka, 1);:我期望第一個引數 astd::tuple可以傳遞給第二個引數RpcWriteKafka。
為什么我使用std::tuple:如何將帶有引數包的函式傳遞給帶有引數包的函式
目前,它無法編譯。
編譯器產生了兩個錯誤:
mismatched types 'CArgs&&' and 'int',來自1那個元組中的- 第二個引數
RpcWriteKafka是unresolved overloaded function type。
那么如何解決這兩個問題呢?是否可以定義這樣的函式doJob,以便我可以輕松地呼叫它,如上所示main?
uj5u.com熱心網友回復:
首先,第一個引數型別doJob應該是std::tuple<CALLBACK, CArgs...>而不是std::tuple<CALLBACK, CArgs&&...>因為CArgs&&
在這種情況下不能推匯出來。
其次,由于RpcWriteKafka是一個函式模板,你不能doJob像這樣傳遞它,相反,你需要用 lambda 包裝它,所以這應該可以作業(我省略了,Args&&...因為它沒有使用)
template<typename CALLBACK, typename... CArgs, typename FUNC>
void doJob(std::tuple<CALLBACK, CArgs...>&& tp, FUNC func) {
std::apply(func, tp);
}
int main() {
doJob(std::make_tuple([](int i){}, 1),
[](auto... args) { RpcWriteKafka(args...); });
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/473683.html
下一篇:使用模板在類中設定函式型別會出錯
