声明后初始化boost :: array

问题描述 投票:2回答:4

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

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

如果'b'是局部变量,这很好。如果'b'是班级成员怎么样?

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;

这似乎有点浪费,因为它创建'c',初始化它,然后在破坏'c'之前将其复制到b中。

c++ arrays boost c++03
4个回答
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;
};

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()) {}

0
投票

您可以使用以下内容:

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

请注意双{


0
投票

Personnaly,我通过创建自己的初始化函数来解决这类问题。这里,使用预处理器(为了与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);
© www.soinside.com 2019 - 2024. All rights reserved.