もう一つの共通っぽい使用がパラメータオブジェクト」であります"メソッド連鎖がなければ、設定が非常に不便ですが、一時的にすることもできます。
の代わりに:
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();
主な欠点は、あなたが '' A& '*としてthis'を返す、と' *のA =新しいAを書くことができることです。 a-> setA()。setB() 'または(もっと重要なことに)' A b; b.setA()。setB(); '。 –