C++将选项(子集)传递给函数的优雅方式

C++ elegant way of passing (a subset of) options to a function

本文关键字:函数 方式 选项 子集 C++      更新时间:2023-10-16

我有一个函数,其确切的行为由一组标志控制。其中大多数通常是错误的。将它们全部作为参数很快就会变得非常混乱。

我可以为标志创建一个枚举:

enum ParseFlags { assignmentPossible = 1, commaDelimits = 2, isConst = 4 };
PExpression ParseExpr(unsigned int flags);

好一点:现在,在调用函数时,我只需要指定要设置的值,而不是一长串bool

但是,我想知道是否有一种更优雅或更通用的方法将选项子集传递给函数。如果我有非布尔选项怎么办?

我正在寻找一种C++(Boost 还可以)的方式来调用如下函数:

ParseExpr({ isConst: true; maxDepth: 5 });

我可以省略所有我想保留为默认值的值。

为此存在哪些技术和/或库?

从这个库的设计中翻录出来,你可以有一个参数类来表达它的设置方法。

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

这几乎与命名参数一样好。