2016-11-08 3 views
0

Учитывая это std::array, который содержит экземпляры подразделов классов IMyClass:заполняющий массив с элементами в определенных позициях

std::array<std::shared_ptr<IMyClass>, 20> myArr; 

В индексной позиции 0, 5 и 10

std::make_shared<RareSubClass>() 

должен быть назначен на все прочие индексы

std::make_shared<FrequentSubClass>() 

Каков наилучший способ достичь этого?

+0

Как будет обеспечиваться индексы для тех элементов, которые должны стать 'RareSubClass'? Это жестко? – AndyG

+0

Вы в порядке с инициализацией времени исполнения? –

+0

@AndyG Да, экземпляры RareSubClass всегда находятся на указанных позициях. – user1056903

ответ

2

Легко инициализировать этот массив во время выполнения, используя маленькую вспомогательную функцию:

void init_array(std::array<std::shared_ptr<IMyClass>, 20>& arr) { 
     int slot = 0; 
     for(auto& subclass : arr) { 
     switch(slot) { 
     case 0: 
     case 5: 
     case 10: 
      subClass = std::make_shared<RareSubClass>(); 
      break; 
     default: 
      subClass = std::make_shared<FrequentSubClass>(); 
      break; 
     } 
     ++slot; 
     } 
} 
+0

Thx! Я использовал переменную цикла для текущей позиции массива. – user1056903

+0

@user Так как это 'std :: array', и все это выводимо во время компиляции, я даже мог подумать о метапрограммном решении, используя вариационный класс шаблонов с параметрами' 0,5,10'. Но я сомневаюсь, что это стоит усилий до сих пор (было бы интересным экспериментом, хотя). –