2016-05-30 68 views
-2

進入全球模板變量我有模板類應用在C++中,可以通過非模板函數

它應該是這樣的單身人士,我想一次創建它,並從其他文件獲得。

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

這可能嗎?也許在另一種形式中,我只是不想使用模板規範來訪問創建的早期全局應用程序對象

+1

'使用NetworkServiceApp =應用程序; ... NetworkServiceApp a; ......「那是你的意思嗎?做到這一點,你不必在你提到的類型的任何地方重複模板參數? – doug65536

+0

應用程序是hpp庫的一部分。模板規範的應用程序應該在main.cpp中創建,並且用戶應該使用沒有模板參數的庫函數訪問創建的實例。而在我的圖書館中,我不知道使用了哪些模板參數。 –

回答

0

添加一個ApplicationBase類,並讓Application繼承它。將單例訪問器放入基類中,併爲要調用的所有內容添加虛函數。

這樣你總是會與基類交互,但是你可以使用模板參數在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-pimpl-idiom-be-used)。這是矯枉過正的,typedef足以取消傳遞模板參數的要求。 – doug65536

+0

直到C++ 11沒有模板化的typedef。 –

+1

您不需要模板化的typedef。一個簡單的'typedef應用程序應用程序'就是你需要的(或者'使用ApplicationImpl = Application ')。然後'ApplicationImpl'可以代替'Application ' – doug65536