c++ - 类枚举派生类
问题描述
我目前有一个代码如下:
enum class Mode {
Foo,
Bar
};
void function(int a, Mode mode);
我想大幅扩展“模式”。特别是,我想允许一个接受Option
-class 和几个enum
(-like)对象之一的选项参数。这样用户可以执行以下任一操作:
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
但是如果用户不需要为and添加括号,我不知道如何做到这一点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 约束/概念的模板来限制您允许作为参数的内容。
推荐阅读
- microsoft-teams - 团队日历请求导致 Exchange Server 2016 记录未处理的异常 (maxQueryStringLength)
- ssl - 通过 HTTPS 通过其 IP 使用 Python 请求访问主机时出现问题
- sql - Teradata SQL - 请查看正文并为我提供解决方案的逻辑
- excel - 从 FormUser 粘贴代码后,如何删除输入符号小方块?
- typescript - 工件注册表文件中的“自述文件”字段来自哪里
- flutter - Flutter ListView Builder 滚动整个屏幕
- javascript - 如何将 JavaScript 变量传递给 Django 视图
- sql-server - 当 Date 为 null 但不明白为什么以及如何修复它时,我收到一个错误
- python - 如何在 python 中将 "\xff\xfet\x00e\x00s\x00t\x00" 转换为 b'\xff\xfet\x00e\x00s\x00t\x00"'
- python - 在 Python 中合并两列