如何解决模板参数迭代
试图找到一种简单的方法来遍历一组可变参数模板参数。
我的班级拥有一个由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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。