У меня есть функция, точное поведение которой контролируется набором флагов. Большинство из них обычно ложные. Наличие их всех в качестве параметров быстро становится очень грязным.
Я мог бы создать перечисление для флагов:
enum ParseFlags { assignmentPossible = 1, commaDelimits = 2, isConst = 4 };
PExpression ParseExpr(unsigned int flags);
Немного лучше: теперь при вызове функции мне нужно только указать значения, которые я хочу установить, вместо длинного списка bool
s.
Однако я хотел бы знать, существует ли более элегантный или более общий способ передачи подмножества параметров в функцию. Что делать, если у меня есть не булевы параметры?
Я ищу 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();
Что почти так же хорошо, как с именованными параметрами.
Других решений пока нет …