使用折叠表达式扩展带有索引的参数包

我有一个带参数包的模板函数。我想将它扩展为对第二个函数的调用,同时还提供包中项目的索引。我可能可以弄清楚如何用递归来做,但我想尝试用折叠表达式来做。

这是我希望参数包扩展到的函数

template<typename T>
void addToRecord(Record& rec, int idx, T&& val)
{
    // Do some stuff.
}

这是带参数包的函数

template<typename... ARGS>
void addRecord(ARGS&& ...values)
{
    Record rec;
    // addToRecord(rec, ??????)  How do expand 'values' here addToRecord with index of each item?
}

这可能吗?我意识到这并不重要,但我也在努力使用折叠表达式变得更好。

回答

您可以编写一个辅助函数,它接受一个编译时整数序列以及这些值

template<typename... Args, std::size_t... Is>
void addRecord_impl(Record& rec, std::index_sequence<Is...>, Args && ...values)
{
(addToRecord(rec, Is, std::forward<Args>(values)), ...);  // Is and values will be expanded in lock step
}

然后像这样调用这个助手

template<typename... Args>
void addRecord(Args && ...values)
{
Record rec;
addRecord_impl(rec,
std::index_sequence_for<Args...>{},
std::forward<Args>(values)...);
}

这是一个演示


以上是使用折叠表达式扩展带有索引的参数包的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>