模板参数迭代
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。
试图找到一种更简单的方法来遍历一组 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。