C++ 从对象获取模板类型

问题描述 投票:0回答:1

我目前正在开发一个 GUI 应用程序。 我的 GUI 应用程序类是一个单例,它依赖于模板化互斥体和模板化事件处理任务。

//GUIApplication.hpp

#include <cassert>
template<typename Task_T, typename Mutex_T>
class GUIApplication
{
  public:
    GUIApplication()
    {
      m_pInstance = this;
    }
    static Mutex_T& getMutexInstance()
    {
      assert(nullptr != m_pInstance);
      return m_pInstance->m_GuiMutex;
    }
  private:
    inline static GUIApplication<Task_T, Mutex_T>* m_pInstance = nullptr;

    Task_T m_eventTask;
    
    Mutex_T m_GuiMutex;
};

现在我有一些其他类需要在执行操作之前锁定互斥体。但是我不想用这些其他类制作模板。有没有办法从 GUIApplication 的当前实例“派生”或“保存”模板类型。

//Foo.hpp
class Foo
{
  public:
  Foo();
};

//Foo.cpp
#include <mutex>
Foo::Foo()
{
  //here (obviously) the template auto argument deduction fails
  auto lock = std::scoped_lock(GUIApplication::getMutexInstance());
  //do stuff here....
}

谢谢大家的帮助:)

c++ templates singleton
1个回答
0
投票

显然,您无法避免为

GUIApplication
指定模板参数,因此
GUIApplication::getMutexInstance
无法工作。 然而,巧妙地使用别名可以帮助您避免重复自己:

using Mutex = std::mutex;
using Task = MyTask;
using App = GUIApplication<Task, Mutex>;

auto lock = std::scoped_lock(App::getMutexInstance());

同样,您可以向

GUIApplication
添加别名成员,以便更轻松地从中提取模板参数:

template<typename Task_T, typename Mutex_T>
class GUIApplication {
  public:
    using Task = Task_T;
    using Mutex = Mutex_T;
  // ...
};

// ...
using App = GUIApplication<Task, Mutex>;
using Task = App::Task;
using Mutex = App::Mutex;
© www.soinside.com 2019 - 2024. All rights reserved.