假设您有一个接受布尔参数的函数:
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 {};
上述实现有任何行为差异吗?我还想知道为什么我以前从未见过使用该模式的建议,因为对我来说这似乎非常有用。这有什么问题吗?