Инициализировать вектор общих указателей в различных структурах данных - PullRequest
0 голосов
/ 09 сентября 2018

Я играю с вариадическими структурами, и я как ребенок с коробкой спичек. Цель состоит в том, чтобы инициализировать вектор указателей базового класса, используя расширение пакета параметров. Дано:

   struct base {
     base() {};
     virtual ~base() {};
     ...
   };

   template<class T>
   struct derived : public base {
     derived() {};
     virtual ~derived() {};
     ...
   };

   struct collection {
     collection() 
       : a{ make_shared<derived<int>>(),
            make_shared<derived<float>>(),
            make_shared<derived<double>>() } {};
     ~collection() {};
     vector<shared_ptr<base>> a;
     ...
   };

Можно ли установить элементы в векторе, используя расширение пакета? Следующее не компилируется, но вы поняли идею. Списки аргументов тоже подойдут.

    template<class ...t>
    struct collection2 {
      collection2() : a{ make_shared<derived<t>>... } {}; //????
      ~collection2() {};
      vector<shared_ptr<base>> a;
    };

Так что вы должны быть в состоянии объявить это так:

    int main() {
      collection2<int,float,double> a;
      return 0;
    }

В любом случае, спасибо за ваш вклад или предложения по альтернативам.

1 Ответ

0 голосов
/ 09 сентября 2018

Ваша попытка почти верна. Вам просто не хватает () для вызова make_shared:

template<class ...t>
struct collection2 {
  collection2() : a{ make_shared<derived<t>>()... } {};
  ~collection2() {};
  vector<shared_ptr<base>> a;
};
...