C++设计:具有布尔选项的函数

Vin*_*ent 5 c++ flags boolean

我在C++中有一个"好的设计实践"的问题.我正在用C++ 11编写一个数值库,我使用了大量的元编程和基于模板的技术.但我有一个非常基本的问题:

考虑一个可以有两个非常接近的行为的函数,除了可以通过布尔标志激活的选项.我只考虑开发人员可以设置/取消设置的标志,而不是可以在运行时设置/取消设置的标志.有3种设计可能性:


1)在名称中使用explicit选项编写两个函数:

myFunctionFlag1(...);
myFunctionFlag2(...); 
Run Code Online (Sandbox Code Playgroud)

2)使用模板参数:

template<bool Flag> myFunction(...);
Run Code Online (Sandbox Code Playgroud)

3)使用变量参数:

myFunction(..., const bool flag);
Run Code Online (Sandbox Code Playgroud)

在良好的设计实践方面,哪种解决方案可接受/不可接受?如果有最佳解决方案,那是哪一个?为什么?如果有一个最糟糕的解决方案,那是哪一个?为什么?

编辑:对于所考虑的函数,运行时开销可以被认为是可以忽略不计的,因此这不是最关键的一点.

编辑2:我知道所有三个工作.但是由于我的图书馆将拥有用户,因此需要有可靠/优秀的设计.

选项2是否常见(因为在我看来这是一个很好的妥协)?

Jam*_*lis 11

以上都不是.布尔标志对于代码可读性来说很糟糕.如果标志控制的功能足够小,使用单个函数是有意义的,那么使用单个函数,但不要bool用作标志的类型.相反,使用具有有用名称的枚举器的枚举:

enum class MyFunctionMode { EnableFoo, DisableFoo };

void myFunction(..., MyFunctionMode mode);
Run Code Online (Sandbox Code Playgroud)

这种模式使得在呼叫站点易于理解为该功能提供了哪些选项.可以使用标志组合多个选项.

  • @sftrabbit:是的,我认为`Rectangle`构造函数应该使用一对`Point`s或类似的东西.这样做会使代码更容易理解,并且没有运行时开销(至少没有一个好的,现代的优化编译器).此外,最好使用类型对尽可能多的信息进行编码(例如,不是使用_four整数_,而是有两个2-D点_).在编译时发现类型错误,编译错误远比任何类型的运行时错误都要好,因为它们不会被忽视. (2认同)