在我的项目中,我有很多枚举需要与枚举成员相关联的附加属性和与枚举类型相关联的辅助静态方法。
据我所知,标准的枚举类MyItem {...}无法实现这一点,因此对于我的每个枚举类,我都有一个辅助类MyItemEnum来封装这些辅助静态方法并实例化自身的辅助实例,以便我可以访问它们的方法以获取其他属性。
下面是一个简化的示例,但我相信所有需要讨论的特性都在其中保留。
MyItem.h
我认为意思很明显,我不需要在此提供.cpp部分...... 我使用MyItem作为参数传递给接口,当我需要访问扩展功能时则使用MyItemEnum。
我的第一个问题是,上述方法是否可行,还是我应该考虑完全不同的方法?
我的第二个问题涉及我正在尝试使用constexpr进行的枚举优化:
这将激活constexpr编译时优化,但恐怕在某些情况下,当无法进行编译时评估的constexpr时,编译器将不得不创建MyItemEnum的本地实例(而不是使用对单个全局静态实例的引用),我担心这可能会导致性能损失(我的真实枚举类型有多个成员属性,因此本地实例化可能需要一些时间?)。 这是否是一个合理的担忧?
据我所知,标准的枚举类MyItem {...}无法实现这一点,因此对于我的每个枚举类,我都有一个辅助类MyItemEnum来封装这些辅助静态方法并实例化自身的辅助实例,以便我可以访问它们的方法以获取其他属性。
下面是一个简化的示例,但我相信所有需要讨论的特性都在其中保留。
MyItem.h
enum class MyItem : unsigned int {
Item1 = 1,
Item2 = 5
};
class MyItemEnum {
private:
MyItem myItem;
size_t extInfo;
MyItemEnum(const MyItem& myItem, size_t extInfo);
~MyItemEnum();
public:
static MyItemEnum Item1;
static MyItemEnum Item2;
static const MyItemEnum &get(MyItem myItem);
operator MyItem() const;
size_t getExt() const;
bool hasNext() const;
MyItem next() const;
};
我认为意思很明显,我不需要在此提供.cpp部分...... 我使用MyItem作为参数传递给接口,当我需要访问扩展功能时则使用MyItemEnum。
我的第一个问题是,上述方法是否可行,还是我应该考虑完全不同的方法?
我的第二个问题涉及我正在尝试使用constexpr进行的枚举优化:
enum class MyItem : unsigned int {
Item1 = 1,
Item2 = 5
};
class MyItemEnum {
private:
MyItem myItem;
size_t extInfo;
constexpr MyItemEnum(const MyItem& myItem, size_t extInfo);
public:
static MyItemEnum Item1;
static MyItemEnum Item2;
static constexpr MyItemEnum &get(MyItem myItem);
constexpr operator MyItem();
constexpr size_t getExt();
constexpr bool hasNext();
constexpr MyItem next();
};
它可以编译但显然constexpr没有机会被使用,因为如果我访问:
MyItemEnum::Item1.getExt()
因此编译器不知道Item1实例化时使用了哪些值。 在链接时优化期间,上述表达式是否有可能被评估为constexpr? 或者我可以使用
static constexpr MyItemEnum Item1 = MyItemEnum(MyItem::Item1, 123);
这将激活constexpr编译时优化,但恐怕在某些情况下,当无法进行编译时评估的constexpr时,编译器将不得不创建MyItemEnum的本地实例(而不是使用对单个全局静态实例的引用),我担心这可能会导致性能损失(我的真实枚举类型有多个成员属性,因此本地实例化可能需要一些时间?)。 这是否是一个合理的担忧?