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);