【发布时间】:2020-10-10 21:19:50
【问题描述】:
我希望有一个接收互斥锁类型作为模板参数的类,以便(有条件地)线程安全。如果互斥锁类型等于 NoMutex(我的互斥锁空实现),我不想将此互斥锁成员添加到我的类中,以便节省空间。 我想做这样的事情:
class NoMutex{
// Same interface as std::mutex but empty implementation
// so optimization can remove unnecessary function calls
};
template <class Mutex>
class MyClass {
public:
// Actually I want to hide it somehow. I dont want it to occupy any space if Mutex == NoMutex
some_template_trick<std::is_same_v<Mutex, NoMutex, void, Mutex> mutex;
void someFunction(){
std::unique_lock<Mutex> l(getMutex()); // I want to use std::unique_lock here
// do some concurrent stuff
}
Mutex& getMutex(){
if constexpr(std::is_same_v<Mutex, NoMutex>){
//ok... return reference to temporary is wrong, but i'm hopping
//that gcc will realize there is nothing to be done once all implementations
//are empty.
return NoMutex();
}
return mutex;
}
};
我不想专门化该类,也不想创建 lock() unlock() 方法,我希望它们由 std::unique_lock(); 管理 有可能吗?
提前致谢!
【问题讨论】:
-
为什么在使用NoMutex的时候还要创建std::unique_lock?
-
因为否则我必须在 if constexpr 和 else 内部复制 someFunction 实现。我可以编写另一个函数并在 if/else 中调用它(每个一次)。但我真正想知道的是,是否可以有条件地将数据成员添加到类中,就像可以添加仅在给定某种类型时才能编译的代码。