繁体   English   中英

声明后初始化boost :: array

[英]Initialising boost::array after declaration

我们可以使用以下语法初始化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中。

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

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

您可以使用以下内容:

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

请注意双{

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

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

个人而言,我通过创建自己的初始化函数来解决此类问题。 在这里,使用预处理器(以保持与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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM