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

新手上路,请多包涵

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

 Foo foo =  {bunch, of, things, initialized};

但是,我不能这样做:

 Foo foo;
foo = {bunch, of, things, initialized};

所以,两个问题:

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

   foo.a = 1;
   foo.b = 2;
   foo.c = 3;
   //... ad infinitum

原文由 jim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 522
2 个回答

第一个是聚合初始值设定项 - 您可以在此解决方案中阅读这些和标记的初始值设定项:

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

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

原文由 John Humphreys 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

std::tie(f.a, f.b, f.c) = std::make_tuple(1, 2, 3);

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

std::tie(std::ignore, f.b, std::ignore) = some_tuple; // only f.b modified

如果你发现语法 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);

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

f = foo(1, 2, 3);

原文由 Nikos Athanasiou 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题