Как объявить и запустить лямбду в одном выражении в C ++ 11?

Как почти во всех уважающих себя проектах, в моем собственном также есть макрос для проверки некоторых условий в режиме отладки:

#ifndef NDEBUG
#  define DCHECK(x) if (!(x)) { ... }
#else
#  define DCHECK(x)
#endif

Но сейчас я хочу DCHECK() некоторые сложные условия, такие как права доступа к файлам:

...
auto has_permissions = [fd] {
struct stat st;
if (fstat(fd, &st) == 0) {
return (st.st_mode & (S_IRUSR | S_IWUSR)) == (S_IRUSR | S_IWUSR);
}
return false;
};
DCHECK(has_permissions());
...

Кроме того, я не хочу загрязнять свой код лямбдами, которые нигде не используются, кроме подошвы DCHECK(), поскольку в режиме Release они будут помечены как неиспользуемые переменные.

Таким образом, вопрос: есть ли компактный способ записи DCHECK() оператор, который объявляет, выполняет и проверяет любое сложное условие?

Постскриптум Не обязательно использовать лямбды — это просто мое предложение.

P.P.S. DCHECK() может быть переопределено, но все уже существующие вызовы должны работать без изменений.

2

Решение

Определите лямбду в пределах DCHECK макрос а также вызвать его

DCHECK(([]{ return false; }()));
//                         ^^

Живая демо

3

Другие решения


По вопросам рекламы [email protected]