C“选择”联盟

C“选择”联盟,第1张

概述不确定是否有这个术语,“选择”似乎有效.我在C工作,我有一堆工会,我需要创建工会代表联盟成员之一的选择.跟踪当前的“选择”并始终可用.我目前正在手动编写这些“联合”,但我想知道是否有任何巧妙的技巧可以自动执行此类(半). 我试图实现这一点时遇到了没有赋值运算符重载或非trival构造函数或复制构造函数的union限制,但是我意识到因为我实际上正在跟踪当前的“选择”,所以存在非常明确的行为在几乎所有 不确定是否有这个术语,“选择”似乎有效.我在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,...>),但在编译时强制执行更多类型检查.

两者都用于存储不同类型的对象,例如具有异构容器(std :: vector可以处理std :: string或int).

总结

以上是内存溢出为你收集整理的C“选择”联盟全部内容,希望文章能够帮你解决C“选择”联盟所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1237718.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存