Другое распространенное использование - с «объектами параметров».Без объединения методов их довольно неудобно настраивать, но при этом они могут быть временными.
Вместо:
complicated_function(P1 param1 = default1, P2 param2 = default2, P3 param3 = default3);
Запись:
struct ComplicatedParams {
P1 mparam1;
P2 mparam2;
P3 mparam3;
ComplicatedParams() : mparam1(default1), mparam2(default2), mparam3(default3) {}
ComplicatedParams ¶m1(P1 p) { mparam1 = p; return *this; }
ComplicatedParams ¶m2(P2 p) { mparam2 = p; return *this; }
ComplicatedParams ¶m3(P3 p) { mparam3 = p; return *this; }
};
complicated_function(const ComplicatedParams ¶ms);
Теперь я могу назвать это:
complicated_function(ComplicatedParams().param2(foo).param1(bar));
Это означает, что вызывающая сторона не должна помнить порядок параметров.Без цепочки метода, который должен был бы быть:
ComplicatedParams params;
params.param1(foo);
params.param2(bar);
complicated_function(params);
Я также могу назвать его:
complicated_function(ComplicatedParams().param3(baz));
Что означает, что без определения тонны перегрузок я могу указать толькопоследний параметр и оставьте остальные по умолчанию.
Последний очевидный твик - сделать complicated_function
членом ComplicatedParams
:
struct ComplicatedAction {
P1 mparam1;
P2 mparam2;
P3 mparam3;
ComplicatedAction() : mparam1(default1), mparam2(default2), mparam3(default3) {}
ComplicatedAction ¶m1(P1 p) { mparam1 = p; return *this; }
ComplicatedAction ¶m2(P2 p) { mparam2 = p; return *this; }
ComplicatedAction ¶m3(P3 p) { mparam3 = p; return *this; }
run(void);
};
ComplicatedAction().param3(baz).run();