不确定是否有这个术语,“选择”似乎有效.我在C工作,我有一堆工会,我需要创建工会代表联盟成员之一的选择.跟踪当前的“选择”并始终可用.我目前正在手动编写这些“联合”,但我想知道是否有任何巧妙的技巧可以自动执行此类(半).
我试图实现这一点时遇到了没有赋值运算符重载或非trival构造函数或复制构造函数的union限制,但是我意识到因为我实际上正在跟踪当前的“选择”,所以存在非常明确的行为在几乎所有情况下都要接受.
这就是我现在正在做的事情(只有两个选择,最多可以是10或15)而且它的代码数量相当大,几乎所有代码都只是样板.此外,如果任何人对我下面的内容是否有效甚至是非常有意义有任何评论,仍然会发现一些C的疯狂……
struct MyChoice { struct Choice1 { int a; char* b; }; struct Choice2 { bool c; double d; }; enum Choice { Choice_Choice1,Choice_Choice2 } choice; char _value[max(sizeof(Choice1),sizeof(Choice2))]; // could be private Choice1& choice1() { if(choice == Choice_Choice2) { (*(Choice2*)_value)->~Choice2(); (*(Choice1*)_value) = Choice1(); choice = Choice_Choice1; } return *(Choice1*)_value; } Choice2& choice2() { if(choice == Choice_Choice1) { (*(Choice1*)_value)->~Choice1(); (*(Choice2*)_value) = Choice2(); choice = Choice_Choice2; } return *(Choice2*)_value; } MyChoice() { _choice = Choice_Choice1; (*(Choice1)_value) = Choice1(); } MyChoice(const MyChoice& other) { this->_choice = other.choice; if(this->_choice == Choice_Choice1) (*(Choice1*)_value) = other.choice1(); else (*(Choice2*)_value) = other.choice2(); } ~MyChoice() { if(_choice == Choice_Choice1) (*(Choice1)_value)->~Choice1(); else (*(Choice2)_value)->~Choice2(); } };
谢谢你的帮助
解决方法
试试看boost :: any和boost :: variant.
第一个允许您在boost :: any变量中插入任何类型,跟踪其类型.
它更像是“运行时检查”类型.
第二个强制您定义要插入的所有类型(即boost :: variant< Choice1,Choice2,...>),但在编译时强制执行更多类型检查.
第一个允许您在boost :: any变量中插入任何类型,跟踪其类型.
它更像是“运行时检查”类型.
第二个强制您定义要插入的所有类型(即boost :: variant< Choice1,Choice2,...>),但在编译时强制执行更多类型检查.
两者都用于存储不同类型的对象,例如具有异构容器(std :: vector可以处理std :: string或int).