コンストラクターの一部として多数のパラメーター (つまり、構成) を必要とし、明確に定義された作成手順も必要とするアルゴリズムがあります。したがって、必要なパラメーターを設定し、中間インスタンスと最終インスタンスを作成できるBuilder パターン実装を作成しました。
// somewhere
class SomeAlgo {
public:
SomeAlgo(double a, double b, double c, double d, double e /* etc */);
;
ここで、Builder を次のように定義します。
class SomeAlgoBuilder {
public:
SomeAlgo& createResult() { /* TODO: */ }
virtual SomeAlgoBuilder& creationStep1() = 0;
virtual SomeAlgoBuilder& creationStep2() = 0;
virtual SomeAlgoBuilder& creationStep3() = 0;
// example setter note the builder returns *this
SomeAlgoBuilder& setA(double a) { a_ = a; return *this; }
SomeAlgoBuilder& setB(double b) { b_ = b; return *this; }
// etc
};
この時点ですべて問題ないように見えますが、今度Pull Up
はビルダーのセッターをSomeAlgoConfig
クラスに入れたいと思います。これにより、パラメーターの複雑な長いリストの代わりに単純な構成を渡すユースケースもカバーできるようになります。この単純な構成は、Java で値オブジェクトまたは Bean として知られているものです。新しいビルダーは次のようになります。
// not "is a" config but need the implementation inheritance
// >>>>>> note the need to pass SomeAlgoBuilder as template
class SomeAlgoBuilder : private SomeAlgoConfig<SomeAlgoBuilder> {
public:
SomeAlgo& createResult() { /* TODO: */ }
virtual SomeAlgoBuilder& creationStep1() = 0;
virtual SomeAlgoBuilder& creationStep2() = 0;
virtual SomeAlgoBuilder& creationStep3() = 0;
};
今SomeAlgoConfig
実装:
template<T>
class SomeAlgoConfig {
T& setA(double a) { a_ = a; return *static_cast<T*>(this); }
T& setB(double b) { b_ = b; return *static_cast<T*>(this); }
// etc
}
インテントは次のように使用されます。
SomeAlgoConfig config; // <<< here it won't compile because it misses the T parameter
config.setA(a).setB(b).setC(c);
これは私が推測するトリックを行います。ただし、(ビルダーのコンテキスト外で) 単独で使用したい場合はいつでもSomeAlgoConfig
、パラメーターとして渡すなど、自身のテンプレートパラメーターで宣言する必要がありますSomeAlgoConfig<SomeAlgoConfig>
。テンプレート型としてデフォルトでそれ自体になるように定義するにはどうすればよいですか? たとえば、これを実行してもうまくいきません。その時点では が不明なtemplate<typename T = SomeAlgoConfig> class SomeAlgoConfig
ためです。SomeAlgoConfig