Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
apolukhin opened this issue Mar 18, 2021 · 2 comments
Closed
Labels
-- Непопулярная идея (10 и более дизлайков)

Comments

@apolukhin
Copy link
Member

Перенос предложения: голоса +7, -23
Aвтор идеи: Клеванец Игорь

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

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

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

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

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

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

@apolukhin
Copy link
Member Author

develoit, 15 февраля 2017, 6:59

if (!empty(banned_users)) {
   //...
}

и ведь понятней)
остается только ждать запила в стандарт x.f() <-> f(x)

ya.imdex, 21 февраля 2017, 16:52

if (banned_users.non_empty()) { ... }

Будет еще понятнее

burannah, 24 февраля 2017, 18:25
Разве std::size() не достаточно ?

dix75, 4 марта 2017, 16:38
burannah, не достаточно, эта операция может быть дорогостоящая (например), operator bool() был с константным временем для всех.
Хотя я против идеи.

burannah, 27 марта 2017, 14:14
dix75, ну хотелось бы заметить, что со времён С++11 size() имеет константную сложность для строк и всех контейнеров (у кого он есть). Используешь forward_list - будь готов вызывать empty().

В, 3 марта 2017, 11:59
Не понимаю минусующих.
А особенно тех, кто говорит: "А что, XYZ недостаточно?"
Если вас послушать, для всего достаточно C и void*. Остальное для слабаков.

Сергей Иванов, 21 апреля 2017, 17:13
Представим себе следующий рефактор: заменяем std::vector на std::shared_ptr<std::vector>. Ну, захотелось нам этот вектор куда-то передать по ссылке, бывает. Дальше автоматически заменяем 'banned_users.' на 'banned_users->'. Проверяем - компилируется. Пошли дальше разрабывать. А баг потом тестеры найдут. Может быть.

@apolukhin apolukhin added the -- Непопулярная идея (10 и более дизлайков) label Apr 7, 2021
@apolukhin
Copy link
Member Author

Закрываю, как непопулярную идею. Голосование в международном комитете не пройдёт (но лично мне идея приглянулась).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
-- Непопулярная идея (10 и более дизлайков)
Projects
None yet
Development

No branches or pull requests

1 participant