类似枚举的派生类
Enum-like derived class
我目前有一个代码如下:
enum class Mode {
Foo,
Bar
};
void function(int a, Mode mode);
我想大幅扩展"模式"。特别是,我想允许一个接受Option
类和几个enum
(类似(对象之一的选项参数。这样,用户可以执行以下任一操作:
function(a, Mode::Foo);
function(a, Direction::Forward);
function(a, Option(...));
这在function
的单个过载下可能吗?但是,这样function
只接受一个Option
对象并Mode::Foo
、Mode::Bar
、Direction::Forward
、Direction::Backward
(并且不超过这个,使用通用模板,因为它会破坏我的重载分辨率(。
我的想法是让类派生自Option
,并拥有
void function(int a, const Option& option);
但是我不知道如何在用户不需要为Mode
和Direction
添加括号的情况下执行此操作:
function(a, Mode::Foo());
function(a, Direction::Forward());
function(a, Option(...));
我不想保持向后兼容性。
您可以使用简单的对象作为标志,尽管您将失去enum
的一些优势(即使您也可以解决此问题(:
struct Option{};
struct Mode
{
Mode Foo;
}
将此行放在C++文件中,它应该只在一个翻译单元中
Mode Mode::Foo{};
然后你可以使用简单的重载:
void function(const Option& opt);
当然,您可以放置私有/受保护的构造函数,以防止在类定义之外创建其他对象。
另一种解决方案是使用模板,带有 SFINAE 或 C++20 约束/概念来限制您允许作为参数的内容。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 类似枚举的派生类
- 如何在不实例化派生类的情况下管理一组派生类枚举
- 重写派生类中的枚举值
- 奇怪的是在派生类中使用枚举的经常性模式
- 虚拟方法返回代表派生对象类型的枚举 - 是否可以(在设计方面)
- 使用具有相同名称的(无作用域)基类枚举初始化派生类枚举
- 枚举可执行文件C++派生类
- 模板和派生类定义:错误:"myClass"不是类、命名空间或枚举
- 如何使用包含不同typedef枚举的派生类模板设置构造函数初始化列表