C“选择”联盟

前端之家收集整理的这篇文章主要介绍了C“选择”联盟前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
不确定是否有这个术语,“选择”似乎有效.我在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++相关文章