Здравствуйте, 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? Если это сферический конь в вакууме, пусть юзер в явном виде передаёт значение, которое функция должна вернуть "по умолчанию".
Здравствуйте, rosencrantz, Вы писали:
R>Почему не return (void) doSomethingElse() ?
Хм, а так можно, если doSomethingElse возвращает какой-то тип?
UPD: Ну, действий допустим может быть больше одного вызова функции, типа return doSomethingElse1(), doSomethingElse2(), (void)0;
UPD2: В принципе, конечно, твой вариант можно присунуть в последнее выражение в списке, без отдельного (void)0 в конце, я просто не в курсе, можно ли так скастить к void любой другой тип
R>На основании чего выбран 0? Если это сферический конь в вакууме, пусть юзер в явном виде передаёт значение, которое функция должна вернуть "по умолчанию".
Ну он довольно универсальный штука, как минимум для интегральных типов
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.
Здравствуйте, 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.
Только, имхо, зря это все, исходный вариант был самый нормальный. Экономия на скобочках, необоснованное стремление все записать в одно выражение и т.п. — все это чаще всего затрудняет чтение кода, вопреки ожиданиям.
--
Не можешь достичь желаемого — пожелай достигнутого.
R>Тогда лучше вернуть не 0, а объект, сконструированный по дефолту: R>
R> return doSomethingElse(), ReturnType();
R>
R>Это будет работать для всех типов, конструируемых по дефолту и для void.
Да, это мысль. Чего это я сам недотумкал
R>Только, имхо, зря это все, исходный вариант был самый нормальный. Экономия на скобочках, необоснованное стремление все записать в одно выражение и т.п. — все это чаще всего затрудняет чтение кода, вопреки ожиданиям.
Просто у меня пяток другой однотипных методов, там логики в одну строчку (но разной), а этот бойлерплейт по проверке параметра реально здорово захламляет. Может, конечно, стоит сделать шаблон и разный код передавать как лямбду
Здравствуйте, Marty, Вы писали:
M>Как быть?
Первый вариант хороший и читаемый, ну раз уж очень хочется, то макрос напиши поторый и будет раскрваться в первый вариант, а в коде будет у тебя 1 строчка
Здравствуйте, Videoman, Вы писали:
V>Здравствуйте, _NN_, Вы писали:
_NN>>Так и писать. _NN>>
return doSomethingElse();
V>Так можно писать только, если doSomethingElse() сама возвращает void, а у топикастера doSomethingElse() возвращает тип отличный от void.
Если так, то следует явно игнорировать и снова можно вернуть значение.
Здравствуйте, Igore, Вы писали:
M>>Как быть? I>Первый вариант хороший и читаемый, ну раз уж очень хочется, то макрос напиши поторый и будет раскрваться в первый вариант, а в коде будет у тебя 1 строчка
С Макросом — это вообще говнецо на ровном месте, имхо