按顺序展开参数包

时间:2015-04-14 13:05:16

标签: c++11 variadic-templates

我有一个带元组的函数,我想按顺序遍历元组成员。我当前的版本依赖于编译器,因为它使用函数参数来解包元组成员(在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))...});
         //     ^                                     ^

但这没有编译。

它目前适用于我的系统,但我想要一个适用于所有系统的通用解决方案。

1 个答案:

答案 0 :(得分:2)

支持初始化列表中的包扩展保证从左到右评估:

auto discard = {0, (printMember(std::get<Seq>(members)), 0)...};
(void)discard;