首页 > 解决方案 > 类枚举派生类

问题描述

我目前有一个代码如下:

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(...)); 

我不想保持向后兼容性。

标签: c++

解决方案


您可以使用简单的对象作为标志,尽管您会失去一些优势enum(即使您也可以解决这个问题):

struct Option{};
struct Mode
{
  Mode Foo;
}

将此行放在 C++ 文件中,它应该只在一个翻译单元中

Mode Mode::Foo{};

然后你可以使用简单的重载:

void function(const Option& opt);

您当然可以放置私有/受保护的构造函数来防止在类定义之外创建其他对象。

另一种解决方案是使用带有 SFINAE 或 C++20 约束/概念的模板来限制您允许作为参数的内容。


推荐阅读