声明后初始化boost :: array

时间:2014-04-20 15:34:59

标签: c++ arrays boost c++03

我们可以使用以下语法初始化boost或std :: array:

array<int,5> b = {1, 2, 3, 4, 5};

如果&#39; b&#39;是一个局部变量。如果&#39; b&#39;是班级成员?

b = {1, 2, 3, 4, 5}; // Error: expected an expression
b = array<int,5>{1, 2, 3, 4, 5}; // Error: type name is not allowed 
b = array<int,5>({1, 2, 3, 4, 5}); // Error: expected an expression
b = array<int,5>(1, 2, 3, 4, 5); // Error: no suitable constructor exists to convert from "int" to "array<int, 5>"

你真的必须这样做:

array<int,5> c = {1, 2, 3, 4, 5};

b = c;

这似乎有点浪费,因为它创建了&#39; c,初始化它,然后在销毁之前将其复制到b中。&#39; c。

4 个答案:

答案 0 :(得分:1)

您还可以在声明点初始化数据成员:

struct Foo
{
  array<int,5> b = {1, 2, 3, 4, 5};
};

或者,您也可以使用构造函数初始化列表

struct Foo
{
  Foo() : b{1, 2, 3, 4, 5} {}
  array<int,5> b;
};

请注意,涉及b = X的所有语句都不是初始化,它们是分配

修改: 这种初始化在C ++ 03中是不可能的,但你可以通过调用一个返回一个合适的初始化数组的函数来实现类似的东西:

boost::array<int, 5> make_array()
{
  // trivial example, but you can do more complicated stuff here
  boost::array<int, 5> a = {{1, 2, 3, 4, 5}};
  return a;
}

然后

Foo() : b(make_array()) {}

答案 1 :(得分:0)

您可以使用以下内容:

struct S
{
  std::array<int, 5> b = {{1, 2, 3, 4, 5}};
};

请注意双{

答案 2 :(得分:0)

您可以在问题中创建它们,这将在堆栈上创建临时值,然后将其复制到您的实例(这可能有点浪费),或者您可以使用静态变量和初始化列表,其中任何编译器值得它的盐只会初始化该类的适当成员:

class temp
{
   public:
   temp():b(b_default) {}
   array<int, 5> b;
   static array<int, 5> b_default;
};
array<int, 5> temp::b_default = {1,2,3,4,5};

这种方式可能是“最干净”的方式:(同样,所有体面编译器的单一副本)

class temp
{
   public:
   temp() 
   {
    static const array<int, 5> b_default = {1,2,3,4,5};

    b = b_default;
   }
   array<int, 5> b;
   static const array<int, 5> b_default;
};

答案 3 :(得分:0)

一直以来,我通过创建自己的初始化函数来解决此类问题。在这里,使用预处理器(以保持与C ++ 03的兼容性),但是可以使用可变参数模板(> = c ++ 11)来完成。

#define NMAX_MAKE_ARRAY_PARAMETERS 30
#define MAKE_ARRAY_EDIT(z, n, data) \
  a__[n] = x__ ## n;
#define MAKE_ARRAY_DEFINITION(z, n, data) \
  template <typename T> boost::array<T,n> make_array(BOOST_PP_ENUM_PARAMS(n, const T& x__)) \
  { \
    boost::array<T,n> a__; \
    BOOST_PP_REPEAT(n, MAKE_ARRAY_EDIT, 0) \
    return a__; \
  }
#define MAKE_ARRAY_DEFINITIONS(n) \
  BOOST_PP_REPEAT(BOOST_PP_INC(n), MAKE_ARRAY_DEFINITION, 0)
MAKE_ARRAY_DEFINITIONS(NMAX_MAKE_ARRAY_PARAMETERS)

通过包含此代码,我可以轻松创建大小在0到30之间的数组:

boost::array<double,5> a = make_array<double>(1.0, 2.2, 3.4, 4.6, 5.8);
a = make_array<double>(0.0, 0.1, 0.2, 0.3, 0.4);