我有一个函数,其确切行为由一组标志控制。这些大多数通常是错误的。将它们全部作为参数很快变得非常困惑。
我可以为这些标志创建一个枚举:
enum ParseFlags { assignmentPossible = 1, commaDelimits = 2, isConst = 4 };
PExpression ParseExpr(unsigned int flags);
更好一点:现在,在调用函数时,只需指定要设置的值,而不是一长串的
bool
即可。但是,我想知道是否存在将选项子集传递给函数的更优雅或更通用的方法。如果我有非 bool 选项怎么办?
我正在寻找一种调用如下函数的C++(Boost可以)方法:
ParseExpr({ isConst: true; maxDepth: 5 });
在这里,我可以忽略所有要保留为默认值的值。
存在哪些技术和/或库?
最佳答案
从this library's design翻录,您可以拥有一个参数类,用于管理其set方法。
class ParseFlags
{
public:
ParseFlags& assignable(bool b) {assignable_ = b; return *this;}
ParseFlags& delimiter(char c) {delimiter_ = c; return *this;}
ParseFlags& constness(bool b) {constness_ = b; return *this;}
private:
bool assignable_ = false;
char delimiter_ = ',';
bool constness_ = false;
};
PExpression ParseExpr(const ParseFlags& = ParseFlags{});
像这样称呼它
auto exp = ParseExpr(ParseFlags().constness(false).delimiter('.'));
auto exp2 = ParseExpr();
这几乎与命名参数一样好。