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

C++ C++;将选项(子集)传递给函数的优雅方式,c++,parameter-passing,flags,pass-by-name,C++,Parameter Passing,Flags,Pass By Name,我有一个函数,它的精确行为由一组标志控制。其中大多数通常是错误的。将它们全部作为参数很快就会变得非常混乱 我可以为标志创建枚举: enum ParseFlags { assignmentPossible = 1, commaDelimits = 2, isConst = 4 }; PExpression ParseExpr(unsigned int flags); 更好一点:现在,在调用函数时,我只需要指定要设置的值,而不是一长串bools 但是,我想知道是否有一种更优雅或更通用的方法将选项子

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

我可以为标志创建枚举:

enum ParseFlags { assignmentPossible = 1, commaDelimits = 2, isConst = 4 };
PExpression ParseExpr(unsigned int flags);
更好一点:现在,在调用函数时,我只需要指定要设置的值,而不是一长串
bool
s

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

我正在寻找一个C++(BooSook)调用函数:

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

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

关于位字段呢?您是否考虑过使用
std::map
或更一般的
std::map
?@πάντα的重载ῥεῖ
bool
s作为
unsigned int
中的标志基本上是一个位域,还是不是?是否
make_config().isConst(true)。maxDepth(5)
ok?@FrançoisAndrieux I有点担心开销,但这是一个好主意。Curry是一个不同的东西,即通过指定一个(多个)参数来创建一个具有一个固定参数的新函数以前存在的函数的函数参数。否则,很棒的答案,也许是最简单的技术。我同意,我也很喜欢在C++中命名参数。我到处寻找类似的东西,这是我得到的最好的。