如何一次将多个值分配到结构中?

jim*_*jim 38 c c++ struct

我可以在初始化struct Foo时执行此操作:

Foo foo =  {bunch, of, things, initialized};
Run Code Online (Sandbox Code Playgroud)

但是,我不能这样做:

Foo foo;
foo = {bunch, of, things, initialized};
Run Code Online (Sandbox Code Playgroud)

那么,有两个问题:

  1. 为什么我不能做后者,前者是否只是初始化的特殊构造函数?
  2. 我怎样才能做类似于第二个例子的事情,即在已经初始化之后在一行代码中为结构声明一堆变量?我试图避免必须为具有许多变量的大型结构执行此操作:

    Foo foo;
    
    foo.a = 1;
    foo.b = 2;
    foo.c = 3;
    //... ad infinitum
    
    Run Code Online (Sandbox Code Playgroud)

Dav*_*son 31

试试这个:

Foo foo;
foo = (Foo){bunch, of, things, initialized};
Run Code Online (Sandbox Code Playgroud)

如果你有一个好的编译器(例如GCC),这将有效.您可能需要打开C99模式--std=gnu99,我不确定.

  • @jim - David所显示的聚合赋值语法是在1999年标准中引入的(是的,使用`gcc`你必须指定`--std = c99`或更高版本才能识别它).不幸的是,微软决定不在VS套件中支持C99.看看他们是否决定支持C11会很有趣. (3认同)
  • 结合下面的 @JohnHumpreys 答案,您可以执行以下操作:`foo = (Foo){.bunch = chunk, .of = of, .things = things, .initialized =初始化};` (2认同)

Joh*_*0te 14

第一个是聚合初始化程序 - 您可以在此解决方案上阅读这些和标记的初始化程序:

什么是标记结构初始化语法?

它是一种特殊的初始化语法,在初始化结构后你不能做类似的事情.您可以做的是提供一个成员(或非成员)函数来将您的一系列值作为参数然后在成员函数中分配 - 这将允许您在以同样的方式初始化结构之后完成此操作简洁(当你第一次写完这个功能之后!)


Nik*_*iou 9

在C++ 11中,您可以使用"tie"执行多个赋值(在元组头中声明)

struct foo {
    int a, b, c;
} f;

std::tie(f.a, f.b, f.c) = std::make_tuple(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

如果你的右手表达式是固定大小的,你只需要获得一些元素,你可以使用带有tie的ignore占位符

std::tie(std::ignore, f.b, std::ignore) = some_tuple; // only f.b modified
Run Code Online (Sandbox Code Playgroud)

如果你发现语法std :: tie(fa,fb,fc)代码混乱,你可以让一个成员函数返回那个引用元组

struct foo {
    int a, b, c;
    auto members() -> decltype(std::tie(a, b, c)) {
        return std::tie(a, b, c);
    }
} f;

f.members() = std::make_tuple(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

所有这些都假设重载赋值运算符不是一个选项,因为你的结构不能通过这样的值序列构造,在这种情况下你可以说

f = foo(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)