2016-05-30 33 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