У меня есть функция, в которой оператор foo
должен выполняться в lock_guard
, но только тогда, когда указатель на объект mutex
был предоставлен функции в качестве параметра. В противном случае foo
не должен быть защищен lock_guard
.
Я не могу использовать lock_guard
внутри if
, потому что блокировка будет немедленно выпущена, когда заканчивается блок if
.
так что этот код вздор:
bar( std::mutex * optionalMutex = nullptr )
{
...
if ( nullptr != optionalMutex ) {
std::lock_guard<std::mutex> lockScope( *optionalMutex );
} <- Here the lock ends
foo... <- foo is not protected when optionalMutex was provided
}
Я пробовал что-то вроде этого:
bar( std::mutex * optionalMutex = nullptr )
{
...
nullptr == optionalMutex ? 0 : std::lock_guard<std::mutex> lockScope( *optionalMutex );
// this scope should be protected by lock_guard when optionalMutex was provided
foo...
}
Более или менее единственное возможное решение для меня - повторить foo
:
bar( std::mutex * optionalMutex = nullptr )
{
...
if ( nullptr != optionalMutex ) {
std::lock_guard<std::mutex> lockScope( *optionalMutex );
foo...
} else {
foo...
}
}
Компилятор gcc 4.9.3
не компилирует второй пример и жалуется: error: expected primary-expression before 'lockScope'
. Обновление: Superlokkus объяснил в своем ответе почему.
Но я хочу избежать дубликатов кода и, следовательно, дублировать foo
.
Мой вопрос:
Есть ли элегантный способ реализации этой проблемы и не использовать дубликат foo
. Я знаю, я мог бы использовать лямбда-функцию для группировки foo
, но мне любопытно, есть ли другое решение.