1
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;
}

我需要使用 bar 提供的接受一些参数的 ctor 来构造这个数组,如果它们都构造为相同的值是可以的,因为稍后我将为它们分配正确的值,我只需要对其进行初始化。我用谷歌搜索了这个并尝试了许多不同的语法,但由于某种原因我无法正确理解。

4

2 回答 2

3
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...>{};

以上为我们提供了编译时间序列。

然后,我们可以使用它为您的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到最终函数,然后使用它来制作新元素。

于 2013-07-07T17:43:20.490 回答
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;
};
于 2013-07-07T17:24:09.313 回答