【发布时间】:2019-07-27 01:17:09
【问题描述】:
我正在尝试创建一些工具来创建基于其他类型组合的类型列表。
假设我们有三种类型
struct A{};
struct B{};
struct C{};
我想获得一个元组列表,其中包含 N 种类型 A、B 或 C 的所有可能组合。
对于 N=2 的情况,这将是
std::tuple<A,A>
std::tuple<A,B>
std::tuple<A,C>
std::tuple<B,A>
std::tuple<B,B>
std::tuple<B,C>
std::tuple<C,A>
std::tuple<C,B>
std::tuple<C,C>
我们的想法是创建一个元组,其中包含所有这些类型的容器,以便我以后可以将任何这些类型存储在容器列表中。
template <typename ...Combinations>
using CombinationList = std::tuple<std::vector<Combinations>...>;
我已经有一种机制可以在它适合的容器中插入一个 particupar 元素,但我不知道如何创建组合。
在 cmets 上,人们建议使用 std::vector<Combination<std::variant<A,C,B>, std::variant<A,B,C>>>。尽管这在技术上解决了问题,但我不想使用它,因为 A、B C 的大小非常不同,我不想在运行时访问变体。此外,在某些时候,我需要上传容器中的所有数据
std::tuple<std::vector<Combination>...>
到 GPU,所以我不能在这里使用 std::variant。
我该怎么做?
谢谢!
PD:这与这个问题有关Combination explosion of an enum value (729 combinations...) 在那个问题中,我问我如何轻松生成将进入容器的类型。现在我需要生成容器。
【问题讨论】:
-
std::variant(en.cppreference.com/w/cpp/utility/variant) 的工作量会少很多。 -
你会怎么做?我不确定如何使用变体来实现...
-
使用
std::vector<std::tuple<std::variant<A, B, C>, std::variant<A, B, C>>>之类的东西怎么样? -
A、B 和 C 可以有非常不同的大小。这是针对物理模拟器的,在引导期间我不关心性能,但在模拟期间我(非常)关心它。这就是为什么我不喜欢使用这样的变体。另外,在某个时候,我会将所有数据上传到 GPU
-
您不能创建包含不同类型对象的向量。 C++ 中没有这样的东西。您的选择是 (1) 变体向量或 (2) 指向某些(抽象)基类的(智能)指针的向量,而派生类负责具体类型。
标签: c++ c++14 variadic-templates template-meta-programming cartesian-product