模板参数迭代

Template Parameter iteration

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

我的 class 包含由 Variadic 模板参数表示的对象元组。我想对元组的所有成员执行一个共同的操作,return 一个聚合结果。

一个简化的例子是:

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(),因为那样会限制元组只能存储每种类型之一(除非我在某些方面弄错了)。

是否有更简单的表达方式,无需使用额外的函数。 IE。在 getSize() 中完成所有工作,而不是将工作委托给 getSizeData()?

你可以使用std::apply,它将元组解压成一个参数包,让你写一个fold-expression,像这样:

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

这是一个demo