2013-12-25 1 views
5

Я пытаюсь реализовать набор классов мьютекса и блокировки для встроенной системы. Я никогда не использовал диспетчеризацию тегов раньше, и я не уверен, что я делаю это правильно. Описание, содержащееся в документации по ускорению, имеет следующее:Как правильно использовать диспетчер тегов для выбора конструктора

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;, так как у меня сложилось впечатление, что это несколько лишнее.

ответ

2

Вы не будете нуждаться в Экстерн декларации для try_lock, если заменить его использование в вызове конструктора замок с временным:

Mutex mtx; 
ScopedLock<Mutex> lock(mtx, TryLock()); 

В противном случае компилятор будет передавать копию try_lock в конструкторе, в который указывает, что он захочет связать его.

Когда стандартная библиотека должна сделать это, он использует constexpr:

struct piecewise_construct_t { }; 
constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 
+0

Я имел эту идею раньше, но отличается от примеров тега диспетчерского я видел вокруг и требует дополнительного типирование скобок. Разве компилятор не будет оптимизировать второй аргумент, если метод встроен? – Christoph

+0

Он будет вызывать правильную функцию. – egur

+0

Я бы надеялся, что это оптимизирует его, но то, что я не совсем понимаю, - это то, почему все работает с неопределенным внешним видом. Это просто случай с оптимизацией, или есть что-то в стандарте, которое позволяет ему работать? – razeh

Смежные вопросы