模板参数迭代

问题描述

试图找到一种简单的方法来遍历一组可变参数模板参数。

我的班级拥有一个由Variadic模板参数表示的对象的元组。我想对元组的所有成员执行通用操作,并返回汇总结果。

一个简化的示例是:

template<typename... Args>
struct Holder
{
    std::tuple<Args>    data;

    std::size_t getSize() const
    {
        return getSizeData(std::make_index_sequence<sizeof...(Args)>());
    }
    private:
       template<std::size_t... I>
       std::size_t getSizeData(std::index_sequence<I...>)
       {
           // Initialize
           std::size_t result = 0;

           // Fold expression to iterate across all members in tuple.
           ((result += std::get<I>(data).getSize()),...);

           // Aggregated value returned.
           return result;
       }
};

在这里,对getSize()调用必须委派工作getSizeData()才能执行fold expression才能击中元组的所有成员。

我避免使用std::get<Kind>(data).getSize(),因为那样会限制元组只能存储每种类型中的一种(除非我在某种程度上被弄错了)。

是否有一种无需使用额外功能即可表达的简单方法。即。在getSize()中完成所有工作,而不是将工作委托给getSizeData()

解决方法

您可以使用std::apply,它将元组解压缩为参数包,从而使您可以编写折叠表达式,如下所示:

std::size_t getSize() const
{
    return std::apply([](auto... a) {
        return (a.getSize() + ...);
    },data);
}

这里是demo