Re[2]: Продолжение: Создать переменную со скопом для if
От: watchmaker  
Дата: 11.04.18 17:31
Оценка:
Здравствуйте, Marty, Вы писали:


M>Как обычно, захотелось странного — выполнить только false ветку. Тупой код выглядит так:

M>
if (auto a = getSomething()) {}
M>else
M>{
M>    // false ветка
M>}
M>


M>Идей, как красиво это сделать, нет вообще.


Оставить как есть, либо вынести объявление из условия.
Ну, право, что ты хочешь выгадать от замены?
Re[2]: Продолжение: Создать переменную со скопом для if
От: kov_serg Россия  
Дата: 11.04.18 17:35
Оценка:
Здравствуйте, 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
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 11.04.18 17:51
Оценка:
Здравствуйте, watchmaker, Вы писали:

M>>Идей, как красиво это сделать, нет вообще.


W>Оставить как есть, либо вынести объявление из условия.

W>Ну, право, что ты хочешь выгадать от замены?

Вынести объявление из условия — не вариант, идея была в том, чтобы получить код ошибки в одном флаконе с возвращаемым значением, сразу проверить его на ошибку, сделать что-то полезное в true и false ветках, используя это значение, или, в случае ошибки — код ошибки, и при этом не захламлять именами временных переменных scope, в котором всё это делается.

В принципе, почти все цели удалось достичь, и достаточно элегантно, но вот только ветку false неудобно обрабатывать, если есть только она одна. А кейс довольно частый — проверить результат, и если ошибка, то вернуть её выше, ничего больше не делая
Маньяк Робокряк колесит по городу
Re[3]: Продолжение: Создать переменную со скопом для if
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 11.04.18 17:55
Оценка:
Здравствуйте, kov_serg, Вы писали:

M>>Идей, как красиво это сделать, нет вообще. Во первых, непонятно, как это записать, во вторых (что частично следует из первого) — какие операторы и как надо переопределить.

_>А чем неустраивает обычная запись вида
_>
_>{ auto a=getSomething(); if (condition(a)) {
_>  // condition ветка
_>}}
_>


Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код.
Маньяк Робокряк колесит по городу
Re: Создать переменную со скопом для if
От: Шахтер Интернет  
Дата: 11.04.18 18:08
Оценка:
Здравствуйте, 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
  }
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[4]: Продолжение: Создать переменную со скопом для if
От: kov_serg Россия  
Дата: 11.04.18 20:24
Оценка:
Здравствуйте, Marty, Вы писали:

_>>А чем неустраивает обычная запись вида

_>>
_>>{ auto a=getSomething(); if (condition(a)) {
_>>  // condition ветка
_>>}}
_>>


M>Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код.

Всегда радовало такое оправдание Компилятору плевать на лишние скобки и лишний отступ. А вот сгородить хрень неводомую это всегда пожалйуста, и только ради того чтобы выглядело приятнее на наш взляд.

Вот такую еще можно городуху сделать:
#include <stdio.h>
#include <stdarg.h>

struct A {
    bool fail;
    A() { fail=true; }
    void trace(const char* s,...) { va_list v; va_start(v,s); vprintf(s,v); va_end(v); }
};

int main(int argc,char **argv) {
    struct L {
        int argc; char** argv;
    } l={argc,argv};
    {struct B:A,L { B(L &l):L(l) {

        if (fail) trace("fail argc=%d\n",argc);
        else trace("success\n");

    }}_(l);}
    return 0;
}

Из плюсов старый C++, не засоряет scope, можно писать короче, код можно разбить на методы и т.п.
Re[5]: Продолжение: Создать переменную со скопом для if
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 11.04.18 20:55
Оценка:
Здравствуйте, kov_serg, Вы писали:

M>>Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код.

_>Всегда радовало такое оправдание Компилятору плевать на лишние скобки и лишний отступ. А вот сгородить хрень неводомую это всегда пожалйуста, и только ради того чтобы выглядело приятнее на наш взляд.

Компилятору плевать, а мне нет. Код-то читает и поддерживает не компилятор


_>Вот такую еще можно городуху сделать:


Что это за говно?

Жаль, что ты по существу вопроса ничего не сказал
Маньяк Робокряк колесит по городу
Re[6]: Продолжение: Создать переменную со скопом для if
От: kov_serg Россия  
Дата: 11.04.18 21:16
Оценка:
Здравствуйте, Marty, Вы писали:

M>Жаль, что ты по существу вопроса ничего не сказал

Дык вопроса как токового не было.
Re[6]: Продолжение: Создать переменную со скопом для if
От: watchmaker  
Дата: 11.04.18 21:40
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, kov_serg, Вы писали:


M>>>Относительным неудобством по сравнению с тем, что уже удалось реализовать. Лишние скобки, лишний отступ, лишняя ненужная писанина, которая визуально захламляет код.

_>>Всегда радовало такое оправдание Компилятору плевать на лишние скобки и лишний отступ. А вот сгородить хрень неводомую это всегда пожалйуста, и только ради того чтобы выглядело приятнее на наш взляд.

M>Компилятору плевать, а мне нет. Код-то читает и поддерживает не компилятор


Можно, конечно, сетовать, что отступ лишний присутствует. Но по крайней мере этот код любой программист прочитает и поймёт с первого взгляда. Это же и одно из самых главный свойств приятного для поддержки кода.

А твой код с точки зрения поддержки человеком как раз и ужасен. В нём ни черта не понятно что происходит без заглядывания во внутренности класса.
Да даже тупой макрос
#define IF_NOT(cond) if (cond) {} else
выглядит на порядок более поддерживаемым. Уж по крайней мере глядя на код
IF_NOT(auto a = getSomething()) { 
  use(a); 
}
можно составить гипотезу что он делает.

Короче, реально, если хочешь сэкономить отступ, то лучше напиши макрос.
Re[7]: Продолжение: Создать переменную со скопом для if
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 11.04.18 21:45
Оценка:
Здравствуйте, kov_serg, Вы писали:

M>>Жаль, что ты по существу вопроса ничего не сказал

_>Дык вопроса как токового не было.

Умение читать и понимать прочитанное обычно приходит в старших группах детского сада, либо в младших классах школы
Маньяк Робокряк колесит по городу
Re[7]: Продолжение: Создать переменную со скопом для if
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 11.04.18 22:11
Оценка:
Здравствуйте, 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, не меньше. Или я чего-то не понимаю?
Маньяк Робокряк колесит по городу
Re[2]: Продолжение: Создать переменную со скопом для if
От: Constructor  
Дата: 12.04.18 08:12
Оценка: 1 (1) :)
Здравствуйте, Marty, Вы писали:

M>Как обычно, захотелось странного — выполнить только false ветку. Тупой код выглядит так:

M>
if (auto a = getSomething()) {}
M>else
M>{
M>    // false ветка
M>}
M>


Если хочется все-таки избежать введения "лишнего" блока с отступом, можно сделать так:

#include <iostream>

struct Foo
{
    operator bool () const
    {
        return false;
    }
};

int main()
{
    switch (auto foo = Foo{})
    {
    case false:
        std::cout << "Hello!" << std::endl;
    }
}

Но при этом придется отказаться от explicit оператора приведения типа к bool.
Re[2]: Продолжение: Создать переменную со скопом для if
От: jazzer Россия Skype: enerjazzer
Дата: 18.04.18 02:28
Оценка:
Здравствуйте, Marty, Вы писали:

M>Как обычно, захотелось странного — выполнить только false ветку. Тупой код выглядит так:

M>
if (auto a = getSomething()) {}
M>else
M>{
M>    // false ветка
M>}
M>


Предполагается, что а не bool, но его можно в него конвертнуть?
тогда
if (auto a = getSomething(); !(bool)a)
{
   ///...
}
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Создать переменную со скопом для if
От: jazzer Россия Skype: enerjazzer
Дата: 18.04.18 02:29
Оценка:
Здравствуйте, 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
}
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.