Здравствуйте, Marty, Вы писали:
M>Как обычно, захотелось странного — выполнить только false ветку. Тупой код выглядит так: M>
if (auto a = getSomething()) {}
M>else
M>{
M> // false ветка
M>}
M>
M>Идей, как красиво это сделать, нет вообще. Во первых, непонятно, как это записать, во вторых (что частично следует из первого) — какие операторы и как надо переопределить.
А чем неустраивает обычная запись вида
{ auto a=getSomething(); if (condition(a)) {
// condition ветка
}}
Re[3]: Продолжение: Создать переменную со скопом для if
Здравствуйте, watchmaker, Вы писали:
M>>Идей, как красиво это сделать, нет вообще.
W>Оставить как есть, либо вынести объявление из условия. W>Ну, право, что ты хочешь выгадать от замены?
Вынести объявление из условия — не вариант, идея была в том, чтобы получить код ошибки в одном флаконе с возвращаемым значением, сразу проверить его на ошибку, сделать что-то полезное в true и false ветках, используя это значение, или, в случае ошибки — код ошибки, и при этом не захламлять именами временных переменных scope, в котором всё это делается.
В принципе, почти все цели удалось достичь, и достаточно элегантно, но вот только ветку false неудобно обрабатывать, если есть только она одна. А кейс довольно частый — проверить результат, и если ошибка, то вернуть её выше, ничего больше не делая
Здравствуйте, kov_serg, Вы писали:
M>>Идей, как красиво это сделать, нет вообще. Во первых, непонятно, как это записать, во вторых (что частично следует из первого) — какие операторы и как надо переопределить. _>А чем неустраивает обычная запись вида _>
_>{ auto a=getSomething(); if (condition(a)) {
_> // condition ветка
_>}}
_>
Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код.
Здравствуйте, Marty, Вы писали:
M> Здравствуйте!
M>Всю жизнь казалось (хотя вроде и не когда не пользовался) что в if можно создать переменную и использовать её в блоке if. Теперь появилось auto, и подобное стало удобным и удобочитаемым. Попробовал: M>
if (( auto a = someFunction()).someMethodInA() )
M>{
M> // do something with a
M>}
M>Но что-то не компилится. Это у меня такой глюк был и на самом деле ни раньше, ни сейчас такое нельзя сделать? Или я что-то просто накосячил?
Так низя. В С++17 можно так
if( auto a = someFunction() ; a.someMethodInA() )
{
// do something with a
}
Здравствуйте, Marty, Вы писали:
_>>А чем неустраивает обычная запись вида _>>
_>>{ auto a=getSomething(); if (condition(a)) {
_>> // condition ветка
_>>}}
_>>
M>Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код.
Всегда радовало такое оправдание Компилятору плевать на лишние скобки и лишний отступ. А вот сгородить хрень неводомую это всегда пожалйуста, и только ради того чтобы выглядело приятнее на наш взляд.
Здравствуйте, kov_serg, Вы писали:
M>>Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код. _>Всегда радовало такое оправдание Компилятору плевать на лишние скобки и лишний отступ. А вот сгородить хрень неводомую это всегда пожалйуста, и только ради того чтобы выглядело приятнее на наш взляд.
Компилятору плевать, а мне нет. Код-то читает и поддерживает не компилятор
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, kov_serg, Вы писали:
M>>>Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код. _>>Всегда радовало такое оправдание Компилятору плевать на лишние скобки и лишний отступ. А вот сгородить хрень неводомую это всегда пожалйуста, и только ради того чтобы выглядело приятнее на наш взляд.
M>Компилятору плевать, а мне нет. Код-то читает и поддерживает не компилятор
Можно, конечно, сетовать, что отступ лишний присутствует. Но по крайней мере этот код любой программист прочитает и поймёт с первого взгляда. Это же и одно из самых главный свойств приятного для поддержки кода.
А твой код с точки зрения поддержки человеком как раз и ужасен. В нём ни черта не понятно что происходит без заглядывания во внутренности класса.
Да даже тупой макрос
#define IF_NOT(cond) if (cond) {} else
выглядит на порядок более поддерживаемым. Уж по крайней мере глядя на код
IF_NOT(auto a = getSomething()) {
use(a);
}
можно составить гипотезу что он делает.
Короче, реально, если хочешь сэкономить отступ, то лучше напиши макрос.
Re[7]: Продолжение: Создать переменную со скопом для if
Здравствуйте, watchmaker, Вы писали:
M>>>>Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код. _>>>Всегда радовало такое оправдание Компилятору плевать на лишние скобки и лишний отступ. А вот сгородить хрень неводомую это всегда пожалйуста, и только ради того чтобы выглядело приятнее на наш взляд.
M>>Компилятору плевать, а мне нет. Код-то читает и поддерживает не компилятор
W>Можно, конечно, сетовать, что отступ лишний присутствует. Но по крайней мере этот код любой программист прочитает и поймёт с первого взгляда. Это же и одно из самых главный свойств приятного для поддержки кода.
Любой программист нам не нужен
Ты на работу тоже наверно берешь только тех, кто знает в C++? Или любителей vbs сам натаскиваешь?
Решение чисто прикладное, всем в команде оно понравилось (я про первое решение, без поддержки false ветки как единственной)
W>А твой код с точки зрения поддержки человеком как раз и ужасен. В нём ни черта не понятно что происходит без заглядывания во внутренности класса.
Нужно будет просто разок прочитать coding conventionals и заглянуть во внутренности. Там 50 строчек кода. Не вижу проблемы.
W>Да даже тупой макрос
#define IF_NOT(cond) if (cond) {} else
выглядит на порядок более поддерживаемым. Уж по крайней мере глядя на код
IF_NOT(auto a = getSomething()) {
W> use(a);
W>}
можно составить гипотезу что он делает.
На кофейной гуще гадать тоже весьма продуктивно — качество предсказаний примерно такое же.
W>Короче, реально, если хочешь сэкономить отступ, то лучше напиши макрос.
Базовая идея у тебя отторжения не вызывает? Так? Или нет?
Если надо проверить результат на true, то пишем на C++, а если надо проверить результат на false, то пишем говнокод на макросах? Отличное решение, в духе C++20, не меньше. Или я чего-то не понимаю?
Здравствуйте, Marty, Вы писали:
M> Здравствуйте!
M>Всю жизнь казалось (хотя вроде и не когда не пользовался) что в if можно создать переменную и использовать её в блоке if. Теперь появилось auto, и подобное стало удобным и удобочитаемым. Попробовал: M>
if (( auto a = someFunction()).someMethodInA() )
M>{
M> // do something with a
M>}
M>Но что-то не компилится. Это у меня такой глюк был и на самом деле ни раньше, ни сейчас такое нельзя сделать? Или я что-то просто накосячил?
C++17:
if ( auto a = someFunction(); a.someMethodInA() )
{
// do something with a
}