2016-05-30 7 views
-2

を通じてグローバルテンプレート変数にアクセスするためのC++で可能ですが、私は一度それを作成し、他のファイルから取得したいです。が、それはそれはシングルトンのようなものである必要があり、私は、テンプレートクラスのアプリケーション</p> <p>を持つ非テンプレート関数

//main.cpp 
Application<NetworkService, User, Policy> a; 
a.run(); 
//other files 
//instead of auto a = Application::getInstance<NetworkService, User, Policy>() I want just 
auto a = Application::getInstance() 

可能でしょうか?たぶん別のフォームで、私はちょうどテンプレート仕様を使用して、初期のグローバルなApplicationオブジェクトにアクセスするのではなく、

+1

'Using NetworkServiceApp = Application ; ... NetworkServiceApp a; ...それはあなたが意味することですか?型を記述するたびにテンプレートパラメータを繰り返す必要がないようにしますか? – doug65536

+0

アプリケーションはhppライブラリの一部です。テンプレートを指定したアプリケーションはmain.cppに作成する必要があります。ユーザーは、テンプレート引数なしでライブラリ関数を使用して作成したインスタンスにアクセスする必要があります。そして私の図書館では、どのテンプレート引数が使われたのか分かりません。 –

答えて

0

ApplicationBaseクラスを追加し、アプリケーションに継承させます。シングルトンアクセサを基本クラスに入れ、呼び出すすべての仮想関数を追加します。

このようにして、基本クラスと常にやりとりしますが、テンプレートargsを使用してmain.cppに組み込むことができます。

class ApplicationBase { 
public: 
    static ApplicationBase* getInstance() { 
     return m_instance; 
    } 

    virtual void foo() = 0; 

protected: 
    static ApplicationBase* m_instance; 
} 

template<TNetworkService, TUser, TPolicy> 
class Application : public ApplicationBase { 
public: 
    Application() { 
     m_instance = this; 
    } 

    virtual void foo() { 
     // do something 
    } 
} 

そして、メインの外に、あなたは、アプリケーションのコンストラクタは、親クラスのシングルトンを登録する必要があります

auto a = ApplicationBase::getInstance(); 
a->foo(); 

を呼び出すことができます。

+1

これは[PIMPL](http://stackoverflow.com/questions/60570/why-should-the-pimpli-idiom-be-used)です。これは過大です。typedefはテンプレート引数を渡す要件を取り除くのに十分でしょう。 – doug65536

+0

C++ 11まで、テンプレート化されたtypedefはありませんでした。 –

+1

テンプレート型のtypedefは必要ありません。単純な 'typedef Application ApplicationImpl'だけが必要です(または' ApplicationImpl = Application 'を使用しています)。それで 'Application ' – doug65536

関連する問題

 関連する問題