C++11中如何实现元素一致的不同结构体(含嵌套)间的赋值?
解决方案
1. 让嵌套结构体与Y共享类型
这是最直接的方案,修改X的定义,把嵌套的匿名结构体替换成Y类型,这样就能直接用y = x.z完成赋值:
struct Y { int a = 0; int b = 0; }; struct X { Y z; // 直接复用Y类型,替代原匿名嵌套结构体 int c = 0; }; int main() { X x{ {1,2}, 3 }; Y y; y = x.z; // 现在可以直接赋值 }
2. 为Y添加转换支持(不修改X的情况)
如果无法修改X的定义(比如X是第三方库的结构体),可以给Y添加转换构造函数或赋值运算符重载,利用decltype(X::z)获取X中嵌套结构体的类型:
struct X { struct { int a = 0; int b = 0; } z; int c = 0; }; struct Y { int a = 0; int b = 0; // 转换构造函数 Y(const decltype(X::z)& other) : a(other.a), b(other.b) {} // 赋值运算符重载 Y& operator=(const decltype(X::z)& other) { a = other.a; b = other.b; return *this; } }; int main() { X x{1,2,3}; Y y; y = x.z; // 支持直接赋值 }
3. 结构化绑定简化赋值(C++17及以上)
如果不想修改任何结构体定义,可以用C++17的结构化绑定一次性提取成员,简化赋值代码:
int main() { X x{1,2,3}; Y y; auto [a, b] = x.z; y = {a, b}; // 或者直接初始化: // Y y{x.z.a, x.z.b}; }
内容的提问来源于stack exchange,提问作者furynerd
相关产品推荐
相关产品推荐

