class Bar
{
Bar( var1 v1, var2 v2 )
{
// setup Bar fields
}
// bar fields
}
class Foo
{
Foo()
:
mArray();// how to do this part
{
}
std::array<Bar, 800> mArray;
}
Мне нужно построить этот массив с некоторыми значениями, используя ctor, который обеспечивает bar, который принимает некоторые параметры, это нормально, если все они построены на одинаковых значениях, потому что позже я назначу им правильные значения, мне просто нужно его инициализировать. Я прогуглил это и попробовал много другого синтаксиса, но по какой-то причине я не могу понять это правильно.
Проблема в том, что Bar
не имеет конструктора по умолчанию, поэтому std::array<Bar>
его тоже нет.
Если вы добавите конструктор по умолчанию в Bar
, std::array<Bar>
будет тоже:
#include <array>
using namespace std;
typedef int var1, var2;
class Bar
{
public:
Bar() {} // <--------- HERE
Bar( var1 v1, var2 v2 )
{
// setup Bar fields
}
// bar fields
};
class Foo
{
Foo()
:
mArray()
{
}
std::array<Bar, 3> mArray;
};
template<unsigned...>struct seq {};
template<unsigned max, unsigned... s>struct make_seq:make_seq<max-1,max-1,s...>{};
template<unsigned...s>struct make_seq<0,s...>:seq<s...>{};
Вышесказанное дает нам возможность компилировать временные последовательности.
Затем мы можем использовать его для генерации ctor на 800 элементов array
,
template<unsigned N> Bar make_bar();
template<unsigned N,unsigned...s>
std::array<Bar,N> make_array_helper( seq<s...> ){
return { make_bar<s>()... };
}
template<unsigned N>
std::array<Bar,N> make_array(){
return make_array_helper( make_seq<N>() );
}
…которые могут содержать опечатки (по телефону), и вы должны написать make_bar
, но это создает ваш массив 800 баров для тебя. Ядром этого является создание пакета параметров из 800 элементов, а затем распаковка его для создания конструктора из 800 элементов.
Альтернативно добавить ctor по умолчанию в Bar
,
Изменение этого, чтобы взять один Bar
и сделать 800 копий тоже не сложно: все, что вам нужно, это передать Bar
до последней функции, затем используйте ее для создания нового элемента.