А void вообще нормально возвращать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.09.21 19:19
Оценка: :)
Здравствуйте!

Насколько void похож на остальные типы?

Вот у меня есть функция вида
void doSomething( int arg, ... )


Хочу, допустим, если int arg < 0, то сделать одно, в остальных случаях — другое. Сейчас пишу так:
void doSomething( int arg, ... )
{
    if (arg<0)
    {
        doSomethingElse();
        return;
    }

    // do main job here

}



Хочу эту запись подсократить, как-то так:
void doSomething( int arg, ...)
{
    if (arg<0)
        return doSomethingElse(), (void)0; // Или что тут написать?

    // do main job here
}


Как быть?

ЗЫ Можно конечно почитать стандарт или задрочить ideone.com в поискать рабочего варианта, но пока мне кажется, что тут быстрее ответ можно получить


ЗЫЫ А если исходная функция вообще шаблон?
template<typename ReturnType>
ReturnType doSomething( int arg, ... )
{
    if (arg<0)
        return doSomethingElse(), (ReturnType)0; // Или что тут написать?
}


и инстанциируется с типом void?
Маньяк Робокряк колесит по городу
Отредактировано 01.09.2021 19:23 Marty . Предыдущая версия .
Re: А void вообще нормально возвращать?
От: rosencrantz  
Дата: 01.09.21 19:33
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Хочу эту запись подсократить, как-то так:

M>
M>void doSomething( int arg, ...)
M>{
M>    if (arg<0)
M>        return doSomethingElse(), (void)0; // Или что тут написать?

M>    // do main job here
M>}
M>


Почему не return (void) doSomethingElse() ?

M>
M>template<typename ReturnType>
M>ReturnType doSomething( int arg, ... )
M>{
M>    if (arg<0)
M>        return doSomethingElse(), (ReturnType)0; // Или что тут написать?
M>}
M>


На основании чего выбран 0? Если это сферический конь в вакууме, пусть юзер в явном виде передаёт значение, которое функция должна вернуть "по умолчанию".
Re[2]: А void вообще нормально возвращать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.09.21 19:36
Оценка:
Здравствуйте, rosencrantz, Вы писали:

R>Почему не return (void) doSomethingElse() ?


Хм, а так можно, если doSomethingElse возвращает какой-то тип?

UPD: Ну, действий допустим может быть больше одного вызова функции, типа return doSomethingElse1(), doSomethingElse2(), (void)0;
UPD2: В принципе, конечно, твой вариант можно присунуть в последнее выражение в списке, без отдельного (void)0 в конце, я просто не в курсе, можно ли так скастить к void любой другой тип


R>На основании чего выбран 0? Если это сферический конь в вакууме, пусть юзер в явном виде передаёт значение, которое функция должна вернуть "по умолчанию".


Ну он довольно универсальный штука, как минимум для интегральных типов
Маньяк Робокряк колесит по городу
Отредактировано 01.09.2021 19:42 Marty . Предыдущая версия . Еще …
Отредактировано 01.09.2021 19:39 Marty . Предыдущая версия .
Re: А void вообще нормально возвращать?
От: RedUser Россия  
Дата: 01.09.21 22:48
Оценка:
Вроде как да.

attr(optional) return expression(optional) ; (1)
...............
1) ... The expression is optional in functions whose return type is (possibly cv-qualified) void, and disallowed in constructors and in destructors.
...............
In a function returning (possibly cv-qualified) void, the return statement with expression can be used, if the expression type is (possibly cv-qualified) void.

en.cppreference.com/w/cpp/language/return

С шаблонами, возвращающими, void, думаю, тоже не должно быть проблем.

Хотя лично мне такая практика не очень нравится.
Re: А void вообще нормально возвращать?
От: bnk СССР http://unmanagedvisio.com/
Дата: 01.09.21 22:53
Оценка: +3
Здравствуйте, Marty, Вы писали:

Вот это понятно любому ёжику:

M> if (arg<0)

M> {
M> doSomethingElse();
M> return;
M> }

А вот это какая-то ересь

M> if (arg<0)

M> return doSomethingElse(), (void)0; // Или что тут написать?

Ты сам-то через год вспомнишь, что ты этим вообще хотел сказать?
Отредактировано 01.09.2021 22:55 bnk . Предыдущая версия .
Re: А void вообще нормально возвращать?
От: rg45 СССР  
Дата: 02.09.21 05:58
Оценка: +5
Здравствуйте, Marty, Вы писали:

M>ЗЫЫ А если исходная функция вообще шаблон?

M>
M>template<typename ReturnType>
M>ReturnType doSomething( int arg, ... )
M>{
M>    if (arg<0)
M>        return doSomethingElse(), (ReturnType)0; // Или что тут написать?
M>}
M>

M>и инстанциируется с типом void?

Тогда лучше вернуть не 0, а объект, сконструированный по дефолту:
    return doSomethingElse(), ReturnType();

Это будет работать для всех типов, конструируемых по дефолту и для void.

Только, имхо, зря это все, исходный вариант был самый нормальный. Экономия на скобочках, необоснованное стремление все записать в одно выражение и т.п. — все это чаще всего затрудняет чтение кода, вопреки ожиданиям.
--
Re[2]: А void вообще нормально возвращать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.09.21 06:24
Оценка:
Здравствуйте, rg45, Вы писали:


R>Тогда лучше вернуть не 0, а объект, сконструированный по дефолту:

R>
R>    return doSomethingElse(), ReturnType();
R>

R>Это будет работать для всех типов, конструируемых по дефолту и для void.

Да, это мысль. Чего это я сам недотумкал


R>Только, имхо, зря это все, исходный вариант был самый нормальный. Экономия на скобочках, необоснованное стремление все записать в одно выражение и т.п. — все это чаще всего затрудняет чтение кода, вопреки ожиданиям.


Просто у меня пяток другой однотипных методов, там логики в одну строчку (но разной), а этот бойлерплейт по проверке параметра реально здорово захламляет. Может, конечно, стоит сделать шаблон и разный код передавать как лямбду
Маньяк Робокряк колесит по городу
Re: А void вообще нормально возвращать?
От: Igore Россия  
Дата: 02.09.21 07:20
Оценка:
Здравствуйте, Marty, Вы писали:

M>Как быть?

Первый вариант хороший и читаемый, ну раз уж очень хочется, то макрос напиши поторый и будет раскрваться в первый вариант, а в коде будет у тебя 1 строчка
Re: А void вообще нормально возвращать?
От: _NN_ www.nemerleweb.com
Дата: 02.09.21 12:28
Оценка: +1
Здравствуйте, Marty, Вы писали:

Так и писать.
return doSomethingElse();


Возвращать void это не проблема.
https://gcc.godbolt.org/z/4xfW6EGd3
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: А void вообще нормально возвращать?
От: Videoman Россия https://hts.tv/
Дата: 02.09.21 13:42
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Так и писать.

_NN>
return doSomethingElse();


Так можно писать только, если doSomethingElse() сама возвращает void, а у топикастера doSomethingElse() возвращает тип отличный от void.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Отредактировано 02.09.2021 13:43 Videoman . Предыдущая версия .
Re[3]: А void вообще нормально возвращать?
От: _NN_ www.nemerleweb.com
Дата: 02.09.21 13:59
Оценка:
Здравствуйте, Videoman, Вы писали:

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


_NN>>Так и писать.

_NN>>
return doSomethingElse();


V>Так можно писать только, если doSomethingElse() сама возвращает void, а у топикастера doSomethingElse() возвращает тип отличный от void.

Если так, то следует явно игнорировать и снова можно вернуть значение.

return static_cast<void>(doSomethingElse());
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: А void вообще нормально возвращать?
От: Videoman Россия https://hts.tv/
Дата: 02.09.21 14:59
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Если так, то следует явно игнорировать и снова можно вернуть значение.

_NN>
_NN>return static_cast<void>(doSomethingElse());

_NN>

Да я-то в курсе
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[2]: А void вообще нормально возвращать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.09.21 15:15
Оценка: -2
Здравствуйте, Igore, Вы писали:

M>>Как быть?

I>Первый вариант хороший и читаемый, ну раз уж очень хочется, то макрос напиши поторый и будет раскрваться в первый вариант, а в коде будет у тебя 1 строчка

С Макросом — это вообще говнецо на ровном месте, имхо
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.