2016-09-30 8 views
1

私はこれをC++でどのように実現するのかよく分かりませんが、自分のコアライブラリを活用するプラグインから特定の種類のオブジェクトを要求すると、私のライブラリのユーザがシングルトンオブジェクトを提供しないようにします。私はさまざまなバリエーションを試しましたが、これはC++のテンプレート化されたファクトリでの実装での私の現在の試みです。ファクトリテンプレートの工場

質問はFooProvider.hスタブにコメントとして埋め込まれています。ありがとう!

/* 
* IFooProvider.h 
*/ 
//Interface - Factory for different variations of IFoo 
class IFooProvider 
{ 
    virtual std::shared_ptr<IFoo> getProvidedFoo(); 
} 

//=========================================================================== 

/* 
* FooProvider.h 
*/ 
template <typename T> //Not sure how to enforce that T is derived from IFoo? 
class FooProvider : public IFooProvider 
{ 
    std::shared_ptr<IFoo> getProvidedFoo() 
    { 
     //This doesn't work. 
     //Not sure how to perform this cast or if this is even possible? 
     std::shared_ptr<IFoo> rtn = std::make_shared<T>(); 
     return rtn; 
    } 
} 

//=========================================================================== 

//Other team's implementation version. Exists in a different library that I have no control over. 

/* 
* MyFooProvider.h 
*/ 
class MyFooProvider : public FooProvider<MyFoo> 
{ 
    //Nothing really going on here. Just want to implement a provider for MyFoo 
} 

//=========================================================================== 
+0

ファクトリメソッドまたはテンプレートクラスを使用してデザインしますが、両方をデザインすることはできません。ファクトリメソッドを使用すると、最小限のパラメータを指定することで、継承されたオブジェクトと登録されたオブジェクトを作成できます。 – seccpur

+1

あなたのコード(コードが不足している)[works](http://cpp.sh/8mx6i) –

答えて

0

をあなたが引く時間をコンパイルしない場合:

template <typename T> 
class FooProvider : public IFooProvider 
{ 
    std::shared_ptr<IFoo> getProvidedFoo() 
    { 
     std::shared_ptr<T> rtn = std::make_shared<T>(); 
     return rtn; 
    } 
} 

不要鋳造を、そしてTはIFooを拡張しない場合は、コンパイルを取得します'rtn'をstd :: shared_ptrからstd :: shared_ptrに変換することができなかったというエラーがありました。かなり明白なエラーメッセージです。

+0

TrevirとUKMonkeyの両方がうまくいきます。素晴らしいです。私は両方を受け入れることができたらいいと思う。 – Klobersaurus

+0

はほんの少しより密接にそれを見てみると... テンプレート クラスFooProvider:公共IFooProvider { のstd :: shared_ptrの getProvidedFoo(){ リターンのstd ::(をmake_shared)。 } } 1行が必要です。 – UKMonkey

0

・ホープ、このことができます:

template <typename T> 
class FooProvider : public IFooProvider 
{ 
    static_assert(std::is_convertible< T*, IFoo* >::value, 
        "Interface needs to be of type IFoo"); 

    std::shared_ptr<IFoo> getProvidedFoo() 
    { 
     std::shared_ptr<IFoo> rtn = 
      static_pointer_cast<IFoo> (std::make_shared<T>()); 
     return rtn; 
    } 
}