Я пытаюсь реализовать набор классов мьютекса и блокировки для встроенной системы. Я никогда не использовал диспетчеризацию тегов раньше, и я не уверен, что я делаю это правильно. Описание, содержащееся в документации по ускорению, имеет следующее:Как правильно использовать диспетчер тегов для выбора конструктора
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;
, так как у меня сложилось впечатление, что это несколько лишнее.
Я имел эту идею раньше, но отличается от примеров тега диспетчерского я видел вокруг и требует дополнительного типирование скобок. Разве компилятор не будет оптимизировать второй аргумент, если метод встроен? – Christoph
Он будет вызывать правильную функцию. – egur
Я бы надеялся, что это оптимизирует его, но то, что я не совсем понимаю, - это то, почему все работает с неопределенным внешним видом. Это просто случай с оптимизацией, или есть что-то в стандарте, которое позволяет ему работать? – razeh