按顺序展开参数包
Expand parameter pack in order
我有一个接受元组的函数,我想按顺序迭代元组成员。我当前的版本依赖于编译器,因为它使用函数参数来解压缩元组成员(在 std::make_tuple()
中)。
我已经构建了一个我正在做的简化示例:
template<typename T>
void* printMember(T const& d)
{
std::cout << d << " ";
return nullptr;
}
template<typename Members, std::size_t... Seq>
void printTuppleMembers(Members const& members, std::index_sequence<Seq...> const&)
{
std::make_tuple(printMember(std::get<Seq>(member))...);
}
template<typename... Members>
void printTupple(std::tuple<Members...> const& members)
{
printTuppleMembers(members, std::make_index_sequence<sizeof...(Members)>());
}
我想不出一种方法来强制为元组的每个成员调用 printMember()
,以便它以正确的顺序为成员 0..n 发生。
我尝试使用初始化列表。
std::make_tuple({printMember(std::get<Seq>(member))...});
// ^ ^
但这并没有编译。
它目前适用于我的系统,但我想要一个适用于所有系统的通用解决方案。
花括号初始化器列表中的包扩展保证从左到右求值:
auto discard = {0, (printMember(std::get<Seq>(members)), 0)...};
(void)discard;
我有一个接受元组的函数,我想按顺序迭代元组成员。我当前的版本依赖于编译器,因为它使用函数参数来解压缩元组成员(在 std::make_tuple()
中)。
我已经构建了一个我正在做的简化示例:
template<typename T>
void* printMember(T const& d)
{
std::cout << d << " ";
return nullptr;
}
template<typename Members, std::size_t... Seq>
void printTuppleMembers(Members const& members, std::index_sequence<Seq...> const&)
{
std::make_tuple(printMember(std::get<Seq>(member))...);
}
template<typename... Members>
void printTupple(std::tuple<Members...> const& members)
{
printTuppleMembers(members, std::make_index_sequence<sizeof...(Members)>());
}
我想不出一种方法来强制为元组的每个成员调用 printMember()
,以便它以正确的顺序为成员 0..n 发生。
我尝试使用初始化列表。
std::make_tuple({printMember(std::get<Seq>(member))...});
// ^ ^
但这并没有编译。
它目前适用于我的系统,但我想要一个适用于所有系统的通用解决方案。
花括号初始化器列表中的包扩展保证从左到右求值:
auto discard = {0, (printMember(std::get<Seq>(members)), 0)...};
(void)discard;