c++ - 如何迭代具有相同基类的元素元组
问题描述
对元组进行迭代是 C++ 世界中的一个常见问题,我知道它可以完成的各种方法——通常使用递归和可变参数模板。
原因是元组通常包含不同的元素类型,正确处理每种类型的唯一方法是拥有与该类型匹配的特定重载。然后我们让编译器使用递归将每个元素分派给正确的函数。
我的情况是这样的:我有一个元素元组,每个元素都是模板类的实例:
std::tuple<my_class<int>, my_class<string>, my_class<float>>
此外,my_class<T>
是 的派生类my_class_base
,它不是模板。
考虑到这个约束,是否可以编写一个at(tuple_type& tuple, size_t n)
函数以 O(1) 步返回元组的第 n 个元素作为对基类的引用?
然后我可以写
for (size_t i = 0; i < N; i++){
auto& o = at<my_base_class>(tuple, i);
o.call_base_method(...);
}
谢谢。
解决方案
您可能只使用std::apply
:
std::apply([](auto&...args){ (args.call_base_method(), ...); }, tuple);
否则要回答您的问题,您可能会执行以下操作:
template <std::size_t... Is, typename tuple_type>
my_class_base& at_impl(std::index_sequence<Is...>, tuple_type& tuple, size_t n)
{
my_class_base* bases[] = {&std::get<Is>(tuple)...};
*return bases[n];
}
template <typename tuple_type>
my_class_base& at(tuple_type& tuple, size_t n)
{
auto seq = std::make_index_sequence<std::tuple_size<tuple_type>::value>();
return at_impl(seq, tuple, n);
}
推荐阅读
- java - 用于 pom 和 jar 文件的构建工具的 Gradle 错误
- sql - 在 PostgreSQL 中使用 COPY TO
- typescript - TypeScript 使用本地声明扩展 discord.js
- azure-language-understanding - 与实体无关的 LUIS 意图
- excel - 获取变量中包含的数字的最后一位
- python-3.x - Windows10 ubuntu bash:chromedriver无法启动Chrome?
- deterministic - Jetson TX2 上的 TensorRT“浮点 16”精度模式是否不确定?
- python - 在密度图上覆盖 Shapefile 数据点
- javascript - 包与其内部 node_modules 包依赖项无关,而是使用外部范围
- python-3.x - 连接到 docker 容器 (aiohttp) 内的 PostreSQL 时连接调用失败