我目前正在开发一个 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....
}
谢谢大家的帮助:)
显然,您无法避免为
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;