我正在嘗試撰寫一個可變引數模板函式,其中包含一個回圈,該回圈對引數包中的每種型別進行迭代。我使用它來構建一個元組,然后我apply在確定模板型別的回呼函式上。
我想我可以使用sizeof...(Args)以下方法做到這一點:
template <typename ...Args>
void addCallback(void* handle, std::string address, std::function<void(Args...)> callback)
{
return addMessageCallback(std::move(address), [callback](const ci::osc::Message& message) {
std::tuple<Args...> args;
for (size_t i = 0; i < sizeof...(Args); i )
{
std::get<i>(args) = message.getArg<std::tuple_element_t<i, decltype(args)>(i);
}
std::apply(callback, std::move(args));
});
}
這不會編譯,因為std::get<i>(args)需要i是編譯時常量。但是,所有資訊在編譯時都可用。有沒有辦法使這項作業?我想過使用折疊運算式但是
我正在使用 C 17。
uj5u.com熱心網友回復:
您可以定義一個輔助函式,用于index_sequence擴展fold 運算式的元素Tuple和賦值。
template<class Tuple, class Message, std::size_t... Is>
void assign_tuple(Tuple& tuple, const Message& message, std::index_sequence<Is...>) {
((std::get<Is>(tuple) = message.getArg<std::tuple_element_t<Is, Tuple>(Is)), ...);
};
template <typename ...Args>
auto addCallback(void* handle, std::string address, std::function<void(Args...)> callback) {
return addMessageCallback(std::move(address), [callback](const ci::osc::Message& message) {
std::tuple<Args...> args;
assign_tuple(args, message, std::make_index_sequence<sizeof...(Args)>{});
std::apply(callback, std::move(args));
});
}
在 C 20 中,您可以在函式內定義模板 lambda 來執行此操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358918.html
