Добавить operator bool() для контейнеров и строк

Клеванец  Игорь
Клеванец Игорь

Текущий стандарт описывает для каждого из контейнеров метод empty(). Его достаточно для полноценной работы.

Operator bool() - это избыточный интерфейс для контейнеров, который ответит на вопрос "Есть ли в контейнере хотя бы один элемент?". Это позволит писать код чище. Предложение написано по мотивам книги "Чистый код: Создание, анализ и рефакторинг" Роберта Мартина.

std::vector<int> banned_users;
//...

// Сейчас можно только так
if (!banned_users.empty()) {
//...
}

// Хочется так:
if (banned_users) {
//...
}

Предложение к стандарту: https://cerevra.github.io/bool/

-14
рейтинг
7 комментариев
develoit
if (!empty(banned_users)) {
//...
}

и ведь понятней)
остается только ждать запила в стандарт x.f() <-> f(x)
develoit
ya.imdex
if (banned_users.non_empty()) { ... }
Будет еще понятнее
ya.imdex
burannah
Разве std::size() не достаточно ?
burannah
dix75
burannah, не достаточно, эта операция может быть дорогостоящая (например), operator bool() был с константным временем для всех.
Хотя я против идеи.
dix75
burannah
dix75, ну хотелось бы заметить, что со времён С++11 size() имеет константную сложность для строк и всех контейнеров (у кого он есть). Используешь forward_list - будь готов вызывать empty().
burannah
jaroslavleff
Не понимаю минусующих.
А особенно тех, кто говорит: "А что, XYZ недостаточно?"
Если вас послушать, для всего достаточно C и void*. Остальное для слабаков.
jaroslavleff
Сергей Иванов
Представим себе следующий рефактор: заменяем std::vector<int> на std::shared_ptr<std::vector<int>>. Ну, захотелось нам этот вектор куда-то передать по ссылке, бывает. Дальше автоматически заменяем 'banned_users.' на 'banned_users->'. Проверяем - компилируется. Пошли дальше разрабывать. А баг потом тестеры найдут. Может быть.
Сергей Иванов
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).