std :: array作为一个字段的语法是什么,里面的对象必须用带参数的ctor构造?

时间:2013-07-07 17:04:25

标签: c++ c++11 stdarray

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来构造这个数组,该ctor接受一些参数,如果它们都被构造成相同的值,那就没关系,因为稍后我将为它们分配正确的值我只需要初始化它。我用谷歌搜索了这个并尝试了许多不同的语法,但由于某些原因我无法做到正确。

2 个答案:

答案 0 :(得分: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生成800元素。

 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元素的构造函数。

将{c}默认ctor添加到Bar

修改此项以获取单个Bar并制作800份副本也不难:您只需要将Bar传递给最终函数,然后使用它来制作新元素。

答案 1 :(得分:1)

问题是Bar没有默认构造函数,因此std::array<Bar>也没有。{/ p>

如果您向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;
};