当前位置: 代码迷 >> 综合 >> 杂货边角(20):匿名非受限联合体实现类的“变长成员”variant member
  详细解决方案

杂货边角(20):匿名非受限联合体实现类的“变长成员”variant member

热度:15   发布时间:2023-12-16 21:51:29.0
#include <iostream>
#include <cstring>using namespace std;/* 联合体的使用,最主要的效果便是内存空间的节省,当然额外的附加作用便是灵活性,但是这种灵活性是以牺牲 可读性为代价的 */
union T {string s;//因为string 是非POD类型,string有non-trivial的构造函数,故而系统会删除T的默认构造函数//error: union member 'T::s' with non-trivial 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'|int n;
public:T() { new (&s) string; } //placement new机制,直接在地址上强制类型初始化~T() { s.~string(); }
};struct Student{Student(bool g, int a) : gender(g), age(a) {}bool gender;int age;
};class Singer {
public:enum Type {STUDENT, NATIVE, FOREIGNER};Singer(bool g, int a): s(g,a) { t = STUDENT; }Singer(int i) : id(i) { t = NATIVE; }Singer(const char* n, int s) {int size = (s>9) ? 9 : s;memcpy(name, n, size);name[s] = '\0';t = FOREIGNER;}~Singer() {}
private:Type t;union { //C++11引入的匿名的非受限结构体,从而配合类,可实现“变长成员”定义的效果variant memberStudent s;int id;char name[10];};
};int main()
{T t; //因为T的默认构造函数被删除了,所以如果不显示定义,则会出现error: use of deleted function 'T::T()'Singer a(true, 24);Singer b(85767);Singer c("Jack chou", 41);return 0;
}
  相关解决方案