У меня есть функция, в которой оператор 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, но мне любопытно, есть ли другое решение.