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

===============>>#1 票数: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()) {}

===============>>#2 票数:0

您可以使用以下内容:

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

请注意双{

===============>>#3 票数: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;
};

===============>>#4 票数: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);

  ask by Steve translate from so

未解决问题?本站智能推荐:

2回复

使用Boost Assign初始化带有变量值的类似JSON的地图

我正在寻找一种存储JSON结构的方法 作为C ++中由boost::assign:::map_list_of初始化的地图。 像这样 其中某些键映射到字符串,而其他键映射到子映射(hello变体)。 请注意,我仅限于C ++ 03,并且可以使用其他解决方案,例如Boost Pr
3回复

有没有一种优雅的方法来从std :: vector实例化boost :: array?

编写接口时,我必须将std::vector<double>实例转换为boost::array<double,N> 。 每次,通过构造(没有bug),我确定矢量具有正确的大小。 这是我正在做的事情的一个例子(我在接口中有大约100个这样的函数): 有没有更短
1回复

是否有增强make_shared_array和make_scope或仅make_shared?

是否有增强make_shared_array和make_scope_ptr或仅make_shared吗?
1回复

boost :: lambda :: var嵌套在boost :: bind中,不等同于boost :: lambda :: var

我在识别一些简单的boost :: lambda使用问题时遇到了一些麻烦。 我可以制作一个简单的lambda函数,如下所示: 但是,一旦我将该lambda函数包装到绑定中: 它变得不可用: boost :: lambda :: var确实会产生可绑定的功能吗? 我是否
2回复

使用boost :: filesystem时出错

我正在尝试将所有.txt文件读入给定文件夹,并且为此我尝试使用Boost库: 但是我收到两个编译器错误: 我将以下导入导入类头文件: (在其他不相关的事物中,例如) 我究竟做错了什么?
1回复

找不到C ++ Boost文件

我正在尝试使用boost的variant ,但收到此错误: 严重错误C1083:无法打开包含文件:'boost / variant.hpp':没有此类文件或目录 我已将文件包含在项目属性中。 在参考目录和图书馆目录中,我也尝试过 “... \\ LIB”
1回复

Boost筛选适配器编译

我遇到了boost::adaptors::filtered 。 有一个样本来说明问题 不幸的是,我有 此行为的原因是什么以及如何解决?
1回复

Boost.Bind返回类型

我试图用Boost.Assign填充boost::property_tree::ptree 。 因此,我得到以下效果: 但是,当我试图使此代码看起来更好时,它无法编译: 错误消息是 SomeFile.cpp:在函数'boost :: assign :: list_in
1回复

为什么不:: boost :: tie与BOOST_FOREACH一起工作?

我想使用BOOST_FOREACH来迭代boost::ptr_map ,并且遇到了这个看起来很整洁的解决方案 。 我希望使用它来提高可读性,与其他解决方案相比。 我写了以下代码: 但是,这无法编译,并给我以下错误(完整的错误消息有几行,请告诉我是否应该粘贴它们。): 似乎建议
1回复

boost :: bind()是成员函数以对象指针作为占位符来增强boost :: function的成员函数吗?

我在MSVC7上使用boost v1.37。 我停留在这些旧版本上,无法升级,因此请在这里尽我所能,不要提出升级建议。 我有一个包含三个成员函数的类。 我想定义一个boost::function ,可用于在同一类的不同实例上调用不同的成员函数: 绑定看起来像: 我需要b