使用强类型而不是布尔值作为参数标志的舒适方法?

Hen*_*enk 6 c++ strong-typing

假设您有一个接受布尔参数的函数:

void do_something(bool use_some_option);
Run Code Online (Sandbox Code Playgroud)

这有问题,因为在调用站点上,您会看到类似的内容do_something(false),但表达能力不强。如果您有多个此类选项,情况会变得更糟,因为参数可以轻松交换。

因此,通常建议使用强类型而不是布尔值,例如enum class. 但是,您必须在某处定义该枚举,并且使用enum classin 条件语句也相当麻烦。

我的问题enum class option : bool { no, yes };是你不能使用类似的东西if(use_option){...}

这个问题在大型代码库中经常出现,因此最好有一个默认的方法来以方便的方式处理这个问题。我当前的解决方案如下所示:

template<typename Name>
class Option {
public:
  explicit Option(bool enabled): _enabled(enabled) {}
  operator bool() { return _enabled; }
private:
  bool _enabled;
};
Run Code Online (Sandbox Code Playgroud)

现在可以这样使用:

using UseMyOption = Option<struct UseMyOption_>;
void do_something(UseMyOption use_my_option) {
  if(use_my_option) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

对于这个相当普遍的问题,这个设计有什么问题吗?隐式转换回我正在监督的 bool 是否存在任何问题,或者是否应该支持一些进一步的功能?

编辑:似乎代码可以替换为 enum UseMyOption : bool {}; 上述实现有任何行为差异吗?我还想知道为什么我以前从未见过使用该模式的建议,因为对我来说这似乎非常有用。这有什么问题吗?