添加c++;17 C&x2B的constexpr和其他改进+;Java枚举仿真器

添加c++;17 C&x2B的constexpr和其他改进+;Java枚举仿真器,java,c++,enums,c++17,constexpr,Java,C++,Enums,C++17,Constexpr,几年前,我问过一个例子,在C++0x中使用一个类似Java的enum类来模拟一个丰富的enum类。我在征求关于如何改进设计的建议,目标是(1)加工constexpr和(2)避免手动步骤,即我有效地(a)声明嵌套的枚举值,(b)声明并希望很快constexpr初始化静态字段,以及(c)初始化严格弱序枚举集。我想知道模板在这方面是否有帮助 代码非常简单,如下演示所示 具体而言,我希望能够: -打开值。 //! Lookup Enum by <code>aStringVal</cod

几年前,我问过一个例子,在C++0x中使用一个类似Java的enum类来模拟一个丰富的enum类。我在征求关于如何改进设计的建议,目标是(1)加工constexpr和(2)避免手动步骤,即我有效地(a)声明嵌套的枚举值,(b)声明并希望很快constexpr初始化静态字段,以及(c)初始化严格弱序枚举集。我想知道模板在这方面是否有帮助

代码非常简单,如下演示所示

具体而言,我希望能够:

-打开值。

//! Lookup Enum by <code>aStringVal</code>.
static BetterEnum valueOf(const std::string_view aStringVal) {
    for (const auto& rNext : getValues()) {
        if (rNext.getStringVal() == aStringVal) {
            return rNext;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::string(aStringVal));
}
//! Lookup Enum by <code>aValue</code>.
static BetterEnum valueOf(const Value aValue) {
    for (const auto& next : getValues()) {
        if (next.mValue == aValue) {
            return next;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::to_string(aValue));
}
friend std::ostream& operator<<(std::ostream& os, const BetterEnum& rhs) {
    os << rhs.getStringVal();
    return os;
}
下面的代码片段显示了这是如何工作的,限制是,我没有打开BetterEnum::EnumValue1,而是必须打开嵌套的enum值-这并不明显,但它使用整数强制转换运算符:

//! Integral cast operator for switch statements (cast to named enum).
constexpr operator const Value() const noexcept {
    return mValue;
}
我不知道如何绕过这一限制

BetterEnum val = BetterEnum::EnumValue1;

switch (val) {
case BetterEnum::enumvalue1:
    std::cout << BetterEnum::EnumValue1.getStringVal() << std::endl;
    break;
case BetterEnum::enumvalue2:
    std::cout << BetterEnum::EnumValue2.getStringVal() << std::endl;
    break;
case BetterEnum::enumvalue3:
    std::cout << BetterEnum::EnumValue3.getStringVal() << std::endl;
    break;
default:
    ;
}
std::cout << BetterEnum::EnumValue1 << std::endl;
-执行基于值的枚举查找。

//! Lookup Enum by <code>aStringVal</code>.
static BetterEnum valueOf(const std::string_view aStringVal) {
    for (const auto& rNext : getValues()) {
        if (rNext.getStringVal() == aStringVal) {
            return rNext;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::string(aStringVal));
}
//! Lookup Enum by <code>aValue</code>.
static BetterEnum valueOf(const Value aValue) {
    for (const auto& next : getValues()) {
        if (next.mValue == aValue) {
            return next;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::to_string(aValue));
}
friend std::ostream& operator<<(std::ostream& os, const BetterEnum& rhs) {
    os << rhs.getStringVal();
    return os;
}
-仅作为标题实施。

//! Lookup Enum by <code>aStringVal</code>.
static BetterEnum valueOf(const std::string_view aStringVal) {
    for (const auto& rNext : getValues()) {
        if (rNext.getStringVal() == aStringVal) {
            return rNext;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::string(aStringVal));
}
//! Lookup Enum by <code>aValue</code>.
static BetterEnum valueOf(const Value aValue) {
    for (const auto& next : getValues()) {
        if (next.mValue == aValue) {
            return next;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::to_string(aValue));
}
friend std::ostream& operator<<(std::ostream& os, const BetterEnum& rhs) {
    os << rhs.getStringVal();
    return os;
}
我最近通过在类的底部使用添加了对此的支持

inline const BetterEnum BetterEnum::EnumValue1(BetterEnum::enumvalue1, "EnumValue1"sv);
inline const BetterEnum BetterEnum::EnumValue2(BetterEnum::enumvalue2, "EnumValue2"sv);
inline const BetterEnum BetterEnum::EnumValue3(BetterEnum::enumvalue3, "EnumValue3"sv);
-添加constexpr支持。

//! Lookup Enum by <code>aStringVal</code>.
static BetterEnum valueOf(const std::string_view aStringVal) {
    for (const auto& rNext : getValues()) {
        if (rNext.getStringVal() == aStringVal) {
            return rNext;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::string(aStringVal));
}
//! Lookup Enum by <code>aValue</code>.
static BetterEnum valueOf(const Value aValue) {
    for (const auto& next : getValues()) {
        if (next.mValue == aValue) {
            return next;
        }
    }
    throw std::invalid_argument(
        std::string("Illegal Argument: ") + std::to_string(aValue));
}
friend std::ostream& operator<<(std::ostream& os, const BetterEnum& rhs) {
    os << rhs.getStringVal();
    return os;
}

虽然部分添加了std::set的使用限制了我可以创建constexpr的成员数量,因为这需要std::set为constexpr(不是代码> STD::数组< /Cord>),但这不能保证EMI表的唯一性,通过严格的弱排序,通过<代码>操作符被投票,以提醒我为什么“我讨厌C++,更喜欢java和B编程”我真的很嫉妒C++中很多很酷的东西。我以前是另一种方式,但是不断变化的标准让我改变了我的MIDI,我不确定我理解了C++代码还是链接中的解释。代码>以前只能将方法/函数指定为内联,但现在可以对变量执行相同的操作这就是您要模拟的吗?还有其他功能吗?唯一的方法是使用C++。好点,我用C++,我做了一个轻微的调整,基于它看起来有希望。