cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Range-based if (по анаглогии с range-based for) #326

Closed apolukhin closed 2 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +2, -10 Автор идеи: Nate Reinar Windwood

Python-style итерацию уже сделали, почему бы теперь не сделать и проверку наличия элемента в контейнере? Это упрощает код и просто логично.

if (token_expression : range_expression)
    conditional_statement

// Translates into:

{
    auto && __range = range_expression;
    auto && __token = token_expression;
    auto __begin = std::begin(__range);
    auto __end = std::end(__range);

    if (std::find(__begin, __end, __token) != __end)
        conditional_statement
}
apolukhin commented 3 years ago

Nate Reinar Windwood, 16 июля 2018, 14:27 *по аналогии

Nate Reinar Windwood, 25 июля 2018, 21:16 Хоть кто-нибудь из поставивших минус аргументировал бы, что ли :-/

Andrey, 27 июля 2018, 11:07 Nate Reinar Windwood, я не ставил минусов, но вот моя версия, почему в том виде, что Вы предлагаете это ужасная идея (и, кстати, в python'е это резализовано по-нормальному).

Для многих структур данных (к примеру, std::[unordered_]{set,map}) реализация contains через std::find -- это совершенно точно не то, чего хотелось бы.

Nate Reinar Windwood, 8 августа 2018, 22:16 Andrey, ну, значит, нужна функция std::contains, которая будет по-разному перегружена для разных структур, и в которую будет разворачиваться сабж.

yndx-antoshkka, 27 июля 2018, 11:48 Ещё не успел поставить минус... Но аргументация следующая:

Добавлять малоизвестный "синтаксический сахар" в язык - как правило очень плохая идея. Это ведёт к меньшей читаемости кода и риску скатиться в perl. Если собрать весь синтаксический сахар, что предлагали за 5 лет, то получится вот такой C++ код:

while (foo ~~ { @... }) {
  return {} unless foo != bar;
  foo += $&;
} else {
  static decltype(return) var;
  var += @ + ...;
  ++ g{hello}{word}[1:var:max];
  if ("hello":var)
    {};
  var;
}
{} 

Что тут происходит - не разобрать.

Александр Коновалов, 26 сентября 2018, 8:56 Ещё один минус данного решения:

Предполагается, что данный код упростит поиск в контейнерах элемента. Для std::map и std::unordered_map элементом является std::pair. Т.е. в рамках данного синтаксиса получается:

if (std::make_pair("key", "value") : my_map)
    // ...

Это выглядит довольно странным и бесполезным.

apolukhin commented 2 years ago

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