使用折叠表达式扩展带有索引的参数包
我有一个带参数包的模板函数。我想将它扩展为对第二个函数的调用,同时还提供包中项目的索引。我可能可以弄清楚如何用递归来做,但我想尝试用折叠表达式来做。
这是我希望参数包扩展到的函数
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)...);
}
这是一个演示