Size: a a a

2021 March 23

AK

Anton Kashcheev in pro.cxx
Constantine Drozdov
Я всё разглядывал это, но мне не очень нравится, скажем
foo(
   hello
   , is_cruel()
     ? cruel_world
     : not_cruel_world
)
вариант
foo(
   hello,
   is_cruel()
   ? cruel_world
   : not_cruel_world
)
выглядит как-то чище
Зато про запятую точно не забудешь.
источник

PZ

Pavel Zhigulin in pro.cxx
Ofee
Не должно внутри if быть сложных конструкций — мозгу приходится буквально реверсить их смысл из кода. Чем проще выражение — тем лучше

bool is_special = special(
          a, b,
          we_are_descending_to_hell(
              a, b
          )
      );

bool a_plus_b_evaluated_to_special_value =
   std::set{0, 1, 2}.contains(a + b);

if (a_plus_b_evaluated_to_special_value || is_special)
{ /* ... */ }
is_special может быть и не вычислена никогда)) Так что лучше оформить в виде лямбды :) И не использовать такое адовое имя для второй переменной)
источник

CD

Constantine Drozdov in pro.cxx
Anton Kashcheev
Зато про запятую точно не забудешь.
ну за отсутствующую запятую меня компилятор пошлёт
источник

CD

Constantine Drozdov in pro.cxx
Ofee
Не должно внутри if быть сложных конструкций — мозгу приходится буквально реверсить их смысл из кода. Чем проще выражение — тем лучше

bool is_special = special(
          a, b,
          we_are_descending_to_hell(
              a, b
          )
      );

bool a_plus_b_evaluated_to_special_value =
   std::set{0, 1, 2}.contains(a + b);

if (a_plus_b_evaluated_to_special_value || is_special)
{ /* ... */ }
начнётся потом
if (std::move(a_plus_b_evaluated_to_special_value) || std::move(is_special))
{ /* ... */ }
а потом кто-нибудь всё-таки use after move
источник

O

Ofee in pro.cxx
Constantine Drozdov
я HATE. HATE. HATE. HATE. одноразовые переменные
Тогда обернуть в одноразовые функции —
if (a_plus_b_evaluated_to_special_value(a, b) || is_special(a, b)) {}
но разбираться, какое же смысловое значения в итоге собирается из сложного булевого выражения среднестатистическому программисту сложно

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

O

Ofee in pro.cxx
Constantine Drozdov
начнётся потом
if (std::move(a_plus_b_evaluated_to_special_value) || std::move(is_special))
{ /* ... */ }
а потом кто-нибудь всё-таки use after move
bool же
источник

DV

Denis Vorkozhokov in pro.cxx
Есть еще лекции от автора той книги по теоркату
https://youtube.com/user/DrBartosz
источник

CD

Constantine Drozdov in pro.cxx
Pavel Zhigulin
is_special может быть и не вычислена никогда)) Так что лучше оформить в виде лямбды :) И не использовать такое адовое имя для второй переменной)
специальная конвенция на лямбды в ифе? :)))
if (
 [] (auto&& x) {
    return x == 0 || x == 1 || x == 2;
 } (a + b)
 || //...
)
источник

D

Danya in pro.cxx
Denis Vorkozhokov
Есть еще лекции от автора той книги по теоркату
https://youtube.com/user/DrBartosz
И такое бывает, да..
источник

D

Danya in pro.cxx
Constantine Drozdov
специальная конвенция на лямбды в ифе? :)))
if (
 [] (auto&& x) {
    return x == 0 || x == 1 || x == 2;
 } (a + b)
 || //...
)
Вы что курили
источник

BU

Boris Usievich in pro.cxx
Constantine Drozdov
специальная конвенция на лямбды в ифе? :)))
if (
 [] (auto&& x) {
    return x == 0 || x == 1 || x == 2;
 } (a + b)
 || //...
)
вот нафига? if(x=a+b; bla-bla ...
источник

PZ

Pavel Zhigulin in pro.cxx
Ofee
Не должно внутри if быть сложных конструкций — мозгу приходится буквально реверсить их смысл из кода. Чем проще выражение — тем лучше

bool is_special = special(
          a, b,
          we_are_descending_to_hell(
              a, b
          )
      );

bool a_plus_b_evaluated_to_special_value =
   std::set{0, 1, 2}.contains(a + b);

if (a_plus_b_evaluated_to_special_value || is_special)
{ /* ... */ }
auto is_special = 
   []
   (auto a, auto b) -> bool
   {
       return special(
                  a,
                  b,
                  we_are_descending_to_hell(
                      a,
                      b
                  )
              );
   };


bool one_of =
   []
   (auto v, auto s) -> bool
   {
       return s.contains(v);
   }

if (one_of(a + b, std::set{0, 1, 2}) || is_special(a, b))
{
   /* ... */
}
источник

PZ

Pavel Zhigulin in pro.cxx
ТруЪ :)
источник

CD

Constantine Drozdov in pro.cxx
Ofee
bool же
это сейчас bool, а потом будет smth_with_explicit_conversion_to_bool special()
источник

CD

Constantine Drozdov in pro.cxx
Pavel Zhigulin
auto is_special = 
   []
   (auto a, auto b) -> bool
   {
       return special(
                  a,
                  b,
                  we_are_descending_to_hell(
                      a,
                      b
                  )
              );
   };


bool one_of =
   []
   (auto v, auto s) -> bool
   {
       return s.contains(v);
   }

if (one_of(a + b, std::set{0, 1, 2}) || is_special(a, b))
{
   /* ... */
}
не, ну врапить [] от () и явный возврат хвостовой рекурсии лишнее
источник

PZ

Pavel Zhigulin in pro.cxx
Constantine Drozdov
не, ну врапить [] от () и явный возврат хвостовой рекурсии лишнее
Враплю я только для того, чтобы special не вызывать лишний раз. Дорого ж может быть :)
источник

PZ

Pavel Zhigulin in pro.cxx
Компилятор не тупой, он заинлайнит)
источник

BU

Boris Usievich in pro.cxx
нефиг тащить лямбду туда, где она нафиг не нужна. Если только цель не состоит в том, чтобы написать менее читаемый код
источник

CD

Constantine Drozdov in pro.cxx
Pavel Zhigulin
Враплю я только для того, чтобы special не вызывать лишний раз. Дорого ж может быть :)
имею в виду
auto is_special = [] (auto a, auto b) {
   return special(
       a,
       b,
       we_are_descending_to_hell(
           a,
           b
       )
   );
};
источник

PZ

Pavel Zhigulin in pro.cxx
Boris Usievich
нефиг тащить лямбду туда, где она нафиг не нужна. Если только цель не состоит в том, чтобы написать менее читаемый код
Что если вызывать special и we_are_descending_to_hell дорого? На выбор есть:

1. лямбда
2. напрямую пихать в условие
источник