我正在尝试为嵌入式系统实现一组互斥锁和锁定类。我以前从未使用过标签调度,我不确定我做得是否正确。 boost 文档中包含的描述只有这样:
struct input_iterator_tag { };
并用它来选择一个专门的模板函数。我没有模板,我只想根据标签的存在选择特定的构造函数:
// in mutex.h:
struct TryLock { };
// defined nowhere, i.e. there's no cpp file for this:
extern TryLock try_lock;
template<typename MutexType>
class ScopedLock
{
public:
ScopedLock(MutexType& mtx) : m_mtx(mtx), m_acquired(true)
{
m_mtx.lock();
}
ScopedLock(MutexType& mtx, TryLock) : m_mtx(mtx)
{
m_acquired = m_mtx.tryLock();
}
...
}
在我的代码中的某个地方我有一个想要锁定的互斥体:
Mutex mtx;
ScopedLock<Mutex> lock(mtx, try_lock);
这编译得很好并且可以工作。我只是好奇我是否可以摆脱extern TryLock try_lock;
,因为我觉得这有点多余。
如果将锁构造函数调用中的用法替换为临时的,则不需要 try_lock 的 extern 声明:
Mutex mtx;
ScopedLock<Mutex> lock(mtx, TryLock());
否则,编译器会将 try_lock 的副本传递给构造函数,此时它将想要链接它。
当标准库需要这样做时,它使用constexpr
:
struct piecewise_construct_t { };
constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)