2016-05-30 5 views
-2

I Template-Klasse AnwendungIst es möglich, in C++ auf Zugang zu dem globalen Template-Variable durch nicht Template-Funktion

Es soll so etwas wie Singleton sein, ich will es einmal erstellen, und von anderen Dateien.

//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() 

Ist es möglich? Vielleicht in einer anderen Form, ich möchte nur nicht Vorlage Spezifikation Zugang zu erstellenden frühen globalen Anwendungsobjekt

+1

'using NetworkServiceApp = Anwendung ; ... NetworkServiceApp a; ... Hast du das gemeint? Machen Sie es so, dass Sie die Vorlagenparameter nicht überall wiederholen müssen, wo Sie den Typ angeben? – doug65536

+0

Anwendung ist ein Teil einer hpp-Bibliothek. Die Anwendung mitTemplate-Spezifikation sollte in main.cpp erstellt werden, und Benutzer sollten auf die erstellte Instanz mit meiner Bibliotheksfunktion ohne Vorlagenargumente zugreifen. Und in meiner Bibliothek weiß ich nicht, welche Template-Argumente verwendet wurden. –

Antwort

0

Fügen Sie eine Klasse Application und haben Anwendung erben von ihm verwenden. Setzen Sie den Singleton-Zugriffsmechanismus in die Basisklasse und fügen Sie virtuelle Funktionen für alles hinzu, was Sie aufrufen möchten.

diese Weise werden Sie immer mit der Basisklasse in Wechselwirkung treten, aber Sie Schablone args es zu konstruieren, in main.cpp verwenden können.

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 
    } 
} 

außerhalb Haupt Dann können Sie

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

Der Konstruktor für Anwendung aufrufen müssen die Singleton in der übergeordneten Klasse registrieren.

+1

Dies ist [PIMPL] (http://stackoverflow.com/questions/60570/why-should-the-pimpl-idi-om-be-). Dies ist Overkill, ein typedef wäre ausreichend, um die Anforderung zum Übergeben von Vorlagenargumenten zu entfernen. – doug65536

+0

Bis C++ 11 gab es keine Template-Vorlagen. –

+1

Sie benötigen keinen Vorlagen-Typdef. Eine einfache 'typedef Application ApplicationImpl' ist alles was Sie brauchen (oder' mit ApplicationImpl = Application '). Dann 'ApplicationImpl' kann anstelle von' Anwendung '' – doug65536

Verwandte Themen