C联合体与变体类型联合体允许在同一内存位置存储不同类型的数据。C17引入的std::variant提供了类型安全的联合体替代方案。联合体的所有成员共享同一块内存空间。#include#include#includeunion Data {int i;float f;char c;};void basic_union() {Data d;d.i 42;std::cout As int: d.i \n;d.f 3.14f;std::cout As float: d.f \n;std::cout As int (corrupted): d.i \n;std::cout Union size: sizeof(Data) \n;}匿名联合体可以直接访问成员。struct Packet {int type;union {int int_value;float float_value;char char_value;};};void anonymous_union() {Packet p;p.type 1;p.int_value 100;std::cout Type: p.type , Value: p.int_value \n;}带标签的联合体通过额外字段跟踪当前类型。enum class ValueType {INT,FLOAT,STRING};struct TaggedUnion {ValueType type;union {int i;float f;char str[32];};TaggedUnion(int value) : type(ValueType::INT), i(value) {}TaggedUnion(float value) : type(ValueType::FLOAT), f(value) {}TaggedUnion(const char* value) : type(ValueType::STRING) {strncpy(str, value, 31);str[31] \0;}void print() const {switch (type) {case ValueType::INT:std::cout Int: i \n;break;case ValueType::FLOAT:std::cout Float: f \n;break;case ValueType::STRING:std::cout String: str \n;break;}}};void tagged_union_example() {TaggedUnion u1(42);TaggedUnion u2(3.14f);TaggedUnion u3(Hello);u1.print();u2.print();u3.print();}std::variant提供类型安全的联合体功能。void variant_basic() {std::variant v;v 42;std::cout Int: std::get(v) \n;v 3.14f;std::cout Float: std::get(v) \n;v std::string(Hello);std::cout String: std::get(v) \n;}std::visit用于访问variant的值。void variant_visit() {std::variant v 42;std::visit([](auto arg) {using T std::decay_t;if constexpr (std::is_same_v) {std::cout Int: arg \n;} else if constexpr (std::is_same_v) {std::cout Float: arg \n;} else if constexpr (std::is_same_v) {std::cout String: arg \n;}}, v);}variant可以实现类型安全的多态。struct Circle {double radius;};struct Rectangle {double width, height;};using Shape std::variant;double area(const Shape shape) {return std::visit([](auto s) - double {using T std::decay_t;if constexpr (std::is_same_v) {return 3.14159 * s.radius * s.radius;} else if constexpr (std::is_same_v) {return s.width * s.height;}}, shape);}void variant_polymorphism() {Shape s1 Circle{5.0};Shape s2 Rectangle{4.0, 6.0};std::cout Circle area: area(s1) \n;std::cout Rectangle area: area(s2) \n;}std::variant是现代C中实现类型安全联合体的首选方式。
C++联合体与变体类型
发布时间:2026/5/23 2:19:00
C联合体与变体类型联合体允许在同一内存位置存储不同类型的数据。C17引入的std::variant提供了类型安全的联合体替代方案。联合体的所有成员共享同一块内存空间。#include#include#includeunion Data {int i;float f;char c;};void basic_union() {Data d;d.i 42;std::cout As int: d.i \n;d.f 3.14f;std::cout As float: d.f \n;std::cout As int (corrupted): d.i \n;std::cout Union size: sizeof(Data) \n;}匿名联合体可以直接访问成员。struct Packet {int type;union {int int_value;float float_value;char char_value;};};void anonymous_union() {Packet p;p.type 1;p.int_value 100;std::cout Type: p.type , Value: p.int_value \n;}带标签的联合体通过额外字段跟踪当前类型。enum class ValueType {INT,FLOAT,STRING};struct TaggedUnion {ValueType type;union {int i;float f;char str[32];};TaggedUnion(int value) : type(ValueType::INT), i(value) {}TaggedUnion(float value) : type(ValueType::FLOAT), f(value) {}TaggedUnion(const char* value) : type(ValueType::STRING) {strncpy(str, value, 31);str[31] \0;}void print() const {switch (type) {case ValueType::INT:std::cout Int: i \n;break;case ValueType::FLOAT:std::cout Float: f \n;break;case ValueType::STRING:std::cout String: str \n;break;}}};void tagged_union_example() {TaggedUnion u1(42);TaggedUnion u2(3.14f);TaggedUnion u3(Hello);u1.print();u2.print();u3.print();}std::variant提供类型安全的联合体功能。void variant_basic() {std::variant v;v 42;std::cout Int: std::get(v) \n;v 3.14f;std::cout Float: std::get(v) \n;v std::string(Hello);std::cout String: std::get(v) \n;}std::visit用于访问variant的值。void variant_visit() {std::variant v 42;std::visit([](auto arg) {using T std::decay_t;if constexpr (std::is_same_v) {std::cout Int: arg \n;} else if constexpr (std::is_same_v) {std::cout Float: arg \n;} else if constexpr (std::is_same_v) {std::cout String: arg \n;}}, v);}variant可以实现类型安全的多态。struct Circle {double radius;};struct Rectangle {double width, height;};using Shape std::variant;double area(const Shape shape) {return std::visit([](auto s) - double {using T std::decay_t;if constexpr (std::is_same_v) {return 3.14159 * s.radius * s.radius;} else if constexpr (std::is_same_v) {return s.width * s.height;}}, shape);}void variant_polymorphism() {Shape s1 Circle{5.0};Shape s2 Rectangle{4.0, 6.0};std::cout Circle area: area(s1) \n;std::cout Rectangle area: area(s2) \n;}std::variant是现代C中实现类型安全联合体的首选方式。