C++ 声明后初始化boost::数组

C++ 声明后初始化boost::数组,c++,arrays,boost,c++03,C++,Arrays,Boost,C++03,我们可以使用以下语法初始化boost或std::array: array<int,5> b = {1, 2, 3, 4, 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

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

array<int,5> b = {1, 2, 3, 4, 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>"
b={1,2,3,4,5};//错误:应为表达式
b=数组{1,2,3,4,5};//错误:不允许使用类型名称
b=数组({1,2,3,4,5});//错误:应为表达式
b=数组(1,2,3,4,5);//错误:不存在从“int”转换为“array”的合适构造函数
你真的必须这样做吗:

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

b = c;
数组c={1,2,3,4,5};
b=c;

这看起来有点浪费,因为它创建了“c”,初始化它,然后在销毁“c”之前将它复制到b中

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

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


您可以使用以下选项:

struct S
{
  std::array<int, 5> b = {{1, 2, 3, 4, 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
{
公众:
temp():b(b_默认值){}
阵列b;
静态数组b_默认值;
};
数组temp::b_default={1,2,3,4,5};
然而,这种方式可能是“最干净”的方式:(同样,对于所有体面的编译器来说,只有一个副本)

class-temp
{
公众:
温度()
{
静态常量数组b_default={1,2,3,4,5};
b=b_默认值;
}
阵列b;
静态常量数组b_默认值;
};

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

#定义NMAX_MAKE_ARRAY_参数30
#定义生成数组编辑(z,n,数据)\
a__[n]=x___##n;
#定义生成数组定义(z,n,数据)\
模板boost::数组make_数组(boost_PP_ENUM_参数(n,const T&x_u))\
{ \
boost::数组a_u;\
BOOST\u PP\u REPEAT(n,生成数组\u EDIT,0)\
返回一个u;\
}
#定义生成数组定义(n)\
BOOST_PP_REPEAT(BOOST_PP_INC(n),生成数组定义,0)
生成数组定义(NMAX生成数组参数)
包含此代码后,我可以轻松创建大小介于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);
boost::array a=make_数组(1.0,2.2,3.4,4.6,5.8);
a=制作_阵列(0.0,0.1,0.2,0.3,0.4);

不需要双大括号。大括号省略应该允许单大括号。错误:不允许数据初始化。@juanchopanza:gcc 4.8.1需要它:……而我得到了关于clang 3的警告。4@Jarod42我认为要求它是错误的,但这是C++11标准的一个不清楚的方面,它可能已经被C++14.Sta修复了C++编译器C++的C++版本2003版本,编译器支持编译器的版本,但是我不认为编译器的版本会有帮助,但是它支持C++ 03标准。所以你使用C++ 03(它和C++ +0x不同)?也许我不知道C++ +0x实际上是什么,但是,是的,它是2003。所有这些不同版本都混淆了我。<代码> C++ +0x < /Cord>是“下一个标准”的位置持有者。在C++11获得批准之前。未来标准的最佳解释在开发过程中的不完整实现也是如此。因此编译器版本确实很重要,因为版本越大,它就越接近C++11。对不起,变量在类中,编译器不支持数据初始化,所以我不得不这样做在构造函数中进行初始化。我想它们是赋值,是的。@Steve变量也在这里的类中。无论如何,上面的是有效的C++11。如果你不能使用C++11,你应该在问题中明确说明。我清楚地说“我没有使用C++11”。我现在已经删除了它,并添加了标记“C++03”相反。@Steve好吧,你设法让两个人给你C++11答案,所以显然对标记和/或问题有一些混淆。确实如此。那么你是说在C++03中这是不可能的吗?如果不是,将此添加到你的问题将使它被接受:)你仍然在初始化,然后分配给数据成员。没有必要这样做t、 它生成的代码与您的答案完全相同,但不必为我需要初始化的每个数组都有一个方法(只是一个经过优化的额外变量),因此我认为这是最干净的方法。如果您有更好的方法,请发布它。
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;
};
#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)
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);