次の問題を解決する方法を見つけようとしています (実際のコードの削除バージョン、明らかなメモリ リークについて申し訳ありません)。
#include <iostream>
namespace A {
struct Product {
virtual void doSomething() const =0;
};
template<typename T>
struct SpecialProduct : public Product {
T t;
SpecialProduct(T t) : t(t) {};
virtual void doSomething() const { std::cout << "A: " << t << " does something\n"; }
};
struct Factory {
template<typename T>
Product* create(T t = T()) const { return new SpecialProduct<T>(t); }
};
}
namespace B {
struct Product {
virtual void doSomething() const =0;
};
template<typename T>
struct SpecialProduct : public Product {
T t;
SpecialProduct(T t) : t(t) {};
virtual void doSomething() const { std::cout << "B: " << t << " does something\n"; }
};
struct Factory {
template<typename T>
Product* create(T t = T()) const { return new SpecialProduct<T>(t); }
};
}
struct ProductType { };
template<typename T>
struct SpecialProductType : public ProductType {};
int main() {
// I have a factory of a known type
A::Factory f;
// standard procedure
A::Product* p = f.create<int>();
p->doSomething();
// I have a product type description from some source
ProductType* t = /* some source */ 0;
// How do i get a product instance of type t from f?
// A::Product* p = f. ???
}
この場合、異なる名前空間内に、モジュールの複数の実装があります。ファクトリ パターンは、バリアントを処理するために利用されます。各モジュールは、(抽象) 製品と特殊なジェネリック バージョンを提供します。製品タイプは、同じパターンに従う均一なクラス インフラストラクチャを使用して表されます。
私の問題は、特定の製品タイプへのポインターが与えられた場合、特定のファクトリ オブジェクトから対応する特定の製品のインスタンスを生成する関数をどのように実装できるかということです。
アドバイスありがとうございます。