C++ 将元素推回到Std::variant的向量
我在为C++ 将元素推回到Std::variant的向量,c++,c++17,C++,C++17,我在为std::variants的std::vector创建push_back函数时遇到问题。这是迄今为止my struct的最小实现: template<class T, class Ts...> //Must construct with at least 1 argument struct entity_container { entity_container(T arg1, Ts ...args) //constructor, populate vector of std
std::variants
的std::vector
创建push_back
函数时遇到问题。这是迄今为止my struct的最小实现:
template<class T, class Ts...> //Must construct with at least 1 argument
struct entity_container
{
entity_container(T arg1, Ts ...args) //constructor, populate vector of std::variant's
{
entities.push_back(std::forward<decltype(arg1)>(arg1));
auto loop = [&](auto&& arg)
{
entities.push_back(std::forward<decltype(arg)>(arg));
}
(loop(args),...);
}
std::vector<std::variant<T, Ts...>> entities;
}
但是这里面有很多很多问题
E
是否为变体的新类型
extended_-type
将是类似于std::variant
的东西,但实际上我们必须将entity_-container
构建为entity_-container
——我们如何将std::variant
转换为类型包
entities=entities\u new
时,这两个对象具有不同的类型,因此不能相互分配(即使(2)可以固定)
template<class T>
struct Entity{};
Entity<A> entity_a;
Entity<B> entity_b;
Entity<C> entity_c;
entity_container c(entity_a, entity_b);
c.push_back(entity_c);
模板
结构实体{};
实体a;
实体b;
实体c;
实体容器c(实体a、实体b);
c、 推回(实体c);
这给我敲响了很多警钟。这主要是由于运行时和编译时概念的笨拙混合。如果你想编译它,你需要预先知道所有可能的类型,某种形式的类型擦除,或者(正如你在#4中提到的)你必须在每次添加元素时将整个容器复制到一个可能的新类型中,在前面一个问题的回答中,考虑<代码> ObjutsTo> <代码> >代码> @:0x54 53,是的,我开始认为这种方法是一个死胡同。即使它起作用了,它也会slow@jf192210由于实体
是一个模板,您大概知道编译时可能包含的所有类型(a
,B
,C
,等等)std::vector
可能是您所需要的全部。好吧,它应该是std::vector
,问题是,这很好,但是如果您要推回一个实体
,那么您需要扩展变量的类型,我们可以看到我在帖子中描述的问题
template<class T>
struct Entity{};
Entity<A> entity_a;
Entity<B> entity_b;
Entity<C> entity_c;
entity_container c(entity_a, entity_b);
c.push_back(entity_c);