Каков синтаксис для std :: array как поля, и объекты внутри должны быть созданы с помощью ctor, который принимает параметры?

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, который принимает некоторые параметры, это нормально, если все они построены на одинаковых значениях, потому что позже я назначу им правильные значения, мне просто нужно его инициализировать. Я прогуглил это и попробовал много другого синтаксиса, но по какой-то причине я не могу понять это правильно.

1

Решение

Проблема в том, что 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;
};
1

Другие решения

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 до последней функции, затем используйте ее для создания нового элемента.

3

По вопросам рекламы [email protected]