如何给名字不同但元素和类型完全相同的结构体赋值(C++11)?

lnlaulya  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(166)

我得到了两个结构体。这两个结构体的某些部分具有完全相同的元素类型(和名称)。
我如何给一个赋值给另一个?
如下所示:

struct X
{
    struct {
        int a = 0;
        int b = 0;
    } z;
    int c = 0;
};

struct Y
{
    int a = 0;
    int b = 0;
};

int main()
{
    X x{ 1,2,3 };
    Y y;
    // I know i can do:
    y.a = x.z.a;
    y.b = x.z.b;

    // Is there a simple way like:
    // y = x.z;
}

我研究了memcpy,但在我的真实的情况中,X在长度上要复杂得多,动态得多。

f87krz0w

f87krz0w1#

在您的示例中,可以将代码重写为:

struct Y
{
    int a = 0;
    int b = 0;
};

struct X
{
    Y z;
    int c = 0;
};

现在它 * 是 * 相同的结构。

yzxexxkh

yzxexxkh2#

有没有像这样简单的方法:y = x.z;
Ydecltype(X::z)不同。因此,不进行任何进一步调整是不可能的。
一种方法是为Y提供copy assignment operator重载,Y可以接受decltype(X::z)类型,并对Y进行赋值。

struct Y
{
    int a = 0;
    int b = 0;

    using Z_t = decltype(X::z);
    Y& operator=(const Z_t& z)
    {
        a = z.a;
        b = z.b;
        return *this;
    }
};

现在你可以写了

X x{ 1,2,3 };
Y y;

y = x.z;

See a live demo in godbolt.org

mnemlml8

mnemlml83#

这两个变量不是同一类型的,也许你真的希望它们是同一类型的,那么写y = x.z;的“简单”方法是:

struct X {
    struct {
        int a = 0;
        int b = 0;
    } z;
    int c = 0;
};

int main() {
    X x{ 1,2,3 };
    auto y = x.z;
}

decltype(x.z) y;
y = x.z;

相关问题