【问题标题】:Is it possible in C++ to access to global template variable through non template function在 C++ 中是否可以通过非模板函数访问全局模板变量
【发布时间】:2016-09-28 08:02:01
【问题描述】:

我有模板类应用程序

应该是单例的,我想创建一次,从其他文件中获取。

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

有可能吗?也许以另一种形式,我只是不想使用模板规范来访问创建的早期全局应用程序对象

【问题讨论】:

  • using NetworkServiceApp = Application&lt;NetworkService, User, Policy&gt;; ... NetworkServiceApp a; ... 你是这个意思吗?让它不必在提到类型的任何地方重复模板参数?
  • 应用程序是 hpp 库的一部分。应在 main.cpp 中创建具有模板规范的应用程序,然后用户应使用我的库函数访问创建的实例,而无需模板参数。而且在我的库中,我不知道使用了哪些模板参数。

标签: c++ templates c++11 c++14


【解决方案1】:

添加一个类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
    }
}

然后你可以在 main 之外调用

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

Application 的构造函数必须在父类中注册单例。

【讨论】:

  • 这是PIMPL。这太过分了,一个 typedef 就足以消除传递模板参数的要求。
  • 在 C++11 之前没有模板化类型定义。
  • 您不需要模板化的 typedef。您只需要一个简单的typedef Application&lt;A, B, C&gt; ApplicationImpl(或using ApplicationImpl = Application&lt;A, B, C&gt;)。那么ApplicationImpl可以用来代替Application&lt;A,B,C&gt;
  • typedef 总是可以引用一个模板,新的东西是模板 typedef 本身,使用using
  • 我可以使用 c++11 或 c++14 这不是问题。我认为一个简单的 typedef 是行不通的。应用程序是 hpp 库的一部分。应在 main.cpp 中创建具有规范的应用程序,然后用户应使用我的库函数访问创建的实例,而无需模板参数。在我的库中,我不知道使用了哪些模板参数。我想 ApplicationBase 的想法应该可行,我会试试的。那么templayted typedef呢,我可以用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2017-02-24
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多