【问题标题】:Initialize all struct members初始化所有结构成员
【发布时间】:2016-10-15 13:43:08
【问题描述】:

这个问题涉及任何 C++ 普通数据定义,其中有一个构造函数,该构造函数将所有数据成员作为参数并初始化它们。这种过度扩展的初始化列表的唯一原因是为了防止只指定结构的一部分的错误。

这是编写这种结构的典型方法:

struct Struct {
    A a;
    B b;
    C c;
    Struct(A a, B b, C c) : a(a) , b(b), c(c) {}
};

值得注意的是,每个成员的类型写了两次,名字写了四次。实际上,这意味着此类结构的代码是相当可压缩的。有没有更短的方法可以用 C++ 编写这个结构?

【问题讨论】:

  • C++ 相当冗长,我认为没有。一个警告:您应该使用(例如)a{a}, b{b}, c{c},因为统一初始化优于旧的( ) 初始化(请参阅this question
  • 这个类不是一个普通的旧数据类,因为它没有默认构造函数。您需要添加Struct() = default;

标签: c++ struct


【解决方案1】:

如果你的结构不包含任何指针,你可以在 C++11 中使用聚合初始化器。

#include <iostream>
using namespace std;

struct xxx {
    int a, b, c;
};

int main() {
    // your code goes here
    xxx x{1,2,3};
    cout << x.a << x.b << x.c;
    return 0;
}

【讨论】:

【解决方案2】:

有趣的问题。我不认为有更短的方法来写它,尤其是在大多数名字都是一个字母的地方;)

一般来说,C++ 类型定义往往是高度重复的。例如,您必须为所有构造函数和析构函数重复类型的名称。不幸的是,我认为唯一的解决方案是让工具为您生成代码。

【讨论】:

    【解决方案3】:

    在某些情况下,您可能会发现使用 std::par&lt;A, B&gt;std::tuple&lt;A, B, C&gt; 很有用。

    例如:

    std::tuple<A, B, C> t = std::make_tuple(a, b, c);
    

    在某些情况下,这可能对你更有效。

    【讨论】:

    • std::pair&lt;A, B&gt;?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多