我可以在初始化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)
那么,有两个问题:
我怎样才能做类似于第二个例子的事情,即在已经初始化之后在一行代码中为结构声明一堆变量?我试图避免必须为具有许多变量的大型结构执行此操作:
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,我不确定.
Joh*_*0te 14
第一个是聚合初始化程序 - 您可以在此解决方案上阅读这些和标记的初始化程序:
它是一种特殊的初始化语法,在初始化结构后你不能做类似的事情.您可以做的是提供一个成员(或非成员)函数来将您的一系列值作为参数然后在成员函数中分配 - 这将允许您在以同样的方式初始化结构之后完成此操作简洁(当你第一次写完这个功能之后!)
在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)
| 归档时间: |
|
| 查看次数: |
62582 次 |
| 最近记录: |