【问题标题】:Extended enum class扩展枚举类
【发布时间】:2012-11-03 20:18:37
【问题描述】:

我有枚举类,比如说

enum class Enum{
   var1, var2;
}

现在我想添加一些取决于参数的成员,即var3(int)。好的,它不是用于枚举,所以我想通过普通类来改变它,但我的目标是让旧代码(Enum::var1 作为Enum 类型的值)可以编译。

我尝试过这样做(暂时忘记var3,它将是静态函数):

class Enum{
    public:
        const static Enum var1 = Enum(1);
        const static Enum var2 = Enum(2);
    private:
        Enum(int v):v(v){
        }
    int v;
    //operator == using v
};

但它无法编译,因为 Enum 的类型不完整。
我不能在课后声明它,因为它在标题中,所以它不能与多个 cpp 一起使用。此外,这里有公共构造函数也不是什么好主意。

有什么想法吗?

【问题讨论】:

  • 最大的问题是你不能在需要常量表达式的地方使用Enum::var1
  • @Xeo1: constexpr 会修复它吗?顺便说一句,不需要使用 as constexpr(现在,也许)
  • 不,因为类类型不能用作非类型模板参数。
  • @Xeo:无论如何,如果我想添加一些取决于参数的东西,我永远不会有这个优势:),但是感谢有用的评论。
  • 您希望每个人都可以像以前一样使用Enum::var1。但是,如果var1 现在是Enum 类型,而Enum 是类类型,而您之前在常量表达式中使用了Enum::var1,则代码将不再编译。

标签: c++ enums c++11 static-members enum-class


【解决方案1】:

解决方案 1:

对于静态变量问题:在类声明中声明你的静态变量:

class Enum
{
    public:
        static const Enum var1;
        static const Enum var2;
        Enum(int v):v(v)
        {
        }
    private:
        int v;
        //operator == using v
};

然后,为这个类创建一个源文件Enum.cpp,其中包含:

#include "Enum.h"
const Enum Enum::var1 = Enum(1);
const Enum Enum::var2 = Enum(2);

解决方案 2:

如果你希望它只是标题,你可以使用静态变量而不是类变量:

class Enum
{
    public:
        Enum(int v):v(v)
        {
        }
    private:
        int v;
};

namespace Enumeration // It is not possible to name it 'Enum'
{
    // static => local to translation unit. No linking conflict
    static const Enum var1 = Enum(1);
    static const Enum var2 = Enum(2);
}

你可以看到a live example here。唯一的缺点是您不能将类的名称用于命名空间。

【讨论】:

  • 这很酷,但我想取消它,因为我只需要向最终用户提供标头
  • 不能在需要常量表达式的地方使用它们。
  • BTW 不能使用私有 ctor 进行编译。在您的代码中修复它。
  • @RiaD,你可以在类声明之后在Enum.h中写初始化var1var2
  • @Ruu 和用户将收到包含它的两个 cpp 的编译错误。
【解决方案2】:

你可以这样写一个类:

class Enum
{
public
    enum NestedEnum : int
    {
        var1, var2
    };

    static NestedEnum var3;

    Enum(NestedEnum value) : value(value) { }

    operator NestedEnum() const { return value; }
private:
    NestedEnum value;
};

以及您可以声明的其他任何地方:

Enum::var3 = (Enum::NestedEnum)someIntegerVariable;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多