Чёт не рублю в современном C++, поможите, кто может
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.12.20 21:25
Оценка:
Здравствуйте!

Пишу шаблон для хз чего, но оно умеет притворится указателем (на самом деле это QSharedPointer, но не обязательно), по которому есть методы join() и value.getPayload.
Какой payload будет — это и проблема.
Начал писать:
template< typename ResponseType >
inline
auto joinAndGetPayload( ResponseType response ) -> ZZZ
{
    response->join();
    response->value.getPayload();
}


но туплю и хз, что написать вместо ZZZ
Маньяк Робокряк колесит по городу
Отредактировано 23.12.2020 21:53 Marty . Предыдущая версия .
Re: Чёт не рублю в современном C++, поможите, кто может
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.12.20 21:44
Оценка: +1
Здравствуйте, Marty, Вы писали:

Не так страшен C++, как его малюют. Попробовал тупо:

template< typename ResponseType >
inline
auto joinAndGetPayload( ResponseType response ) -> decltype(response->value.getPayload())
{
    response->join();
    return response->value.getPayload();
}

собралось, и работает вроде как надо.

Проблема тупая, конечно — привык, что плюсики по рукам постоянно бьют, вот и боялся тупо попробовать. А оно — работает (и я на самом деле просто только чуть-чуть интуитивно понимаю как). Современные плюсики — охрененные
Маньяк Робокряк колесит по городу
Re: Чёт не рублю в современном C++, поможите, кто может
От: bnk СССР http://unmanagedvisio.com/
Дата: 23.12.20 21:58
Оценка: 4 (1)
Здравствуйте, Marty, Вы писали:

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


M>Пишу шаблон для хз чего, но оно умеет притворится указателем (на самом деле это QSharedPointer, но не обязательно), по которому есть методы join() и getPayload.

M>Какой payload будет — это и проблема.
M>Начал писать:
M>
template< typename ResponseType >
M>inline
M>auto joinAndGetPayload( ResponseType response ) -> ZZZ
M>{
M>    response->join();
M>    response->value.getPayload();
M>}
M>


M>но туплю и хз, что написать вместо ZZZ


Не очень понял вопрос, но уже наблюдаю нарушение принципов SOLID
doXandY = проблема

По сути, почему бы не попробовать auto вместо ZZZ? Ну или вообще ничего (убрать вместе со стрелочкой)? Или decltype(response->value.getPayload())?
Re[2]: Чёт не рублю в современном C++, поможите, кто может
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.12.20 22:49
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Не очень понял вопрос, но уже наблюдаю нарушение принципов SOLID


Да насрать


bnk>doXandY = проблема


Да насрать


bnk>По сути, почему бы не попробовать auto вместо ZZZ? Ну или вообще ничего (убрать вместе со стрелочкой)?


Убрать всё со стрелочкой — это идея, и должно вроде сработать при одном return'е.
Но я сделал, как ты дальше предложил (но я сам догадался, ага )


bnk>Или decltype(response->value.getPayload())?


Вот это и сделал, сработало

ЗЫ Современные плюсики совсем плохо знаю, ага
Маньяк Робокряк колесит по городу
Re[3]: Чёт не рублю в современном C++, поможите, кто может
От: bnk СССР http://unmanagedvisio.com/
Дата: 23.12.20 23:52
Оценка:
Здравствуйте, Marty, Вы писали:

M>ЗЫ Современные плюсики совсем плохо знаю, ага


Да я как-то тоже, только вот старый проект когда ковыряю да видео если какое на ютубе попадется
Сначала запостил, потом обновил страницу, увидел что ты уже сам написал.
Re[2]: Чёт не рублю в современном C++, поможите, кто может
От: RedUser Россия  
Дата: 24.12.20 01:37
Оценка: 4 (1)
M>
template< typename ResponseType >
M>inline
M>auto joinAndGetPayload( ResponseType response ) -> decltype(response->value.getPayload())
M>{
M>    response->join();
M>    return response->value.getPayload();
M>}

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

В C++14 можно выкинуть
-> decltype(response->value.getPayload())

https://ru.wikipedia.org/wiki/C++14#Вывод_типа_возвращаемого_значения_для_функций
Re[2]: Чёт не рублю в современном C++, поможите, кто может
От: LaptevVV Россия  
Дата: 24.12.20 04:28
Оценка:
M>
template< typename ResponseType >
M>inline
M>auto joinAndGetPayload( ResponseType response ) -> decltype(response->value.getPayload())
M>{
M>    response->join();
M>    return response->value.getPayload();
M>}

Зашибись!
Паттерн Фабричный метод в одной строчке...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Чёт не рублю в современном C++, поможите, кто может
От: Максим Россия  
Дата: 24.12.20 06:56
Оценка: 9 (2)
M>
template< typename ResponseType >
M>inline
M>auto joinAndGetPayload( ResponseType response ) -> decltype(response->value.getPayload())
M>{
M>    response->join();
M>    return response->value.getPayload();
M>}

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

А какая версия С++ используется? Разве начиная с С++14 не должно работать без trailing return type (так вроде -> называется)? Еще в книгах пишут, что если метод getPayload возвращает ссылочный тип, то это может быть не то, что вы хотите. Поэтому рекомендуют делать низведение


auto joinAndGetPayload( ResponseType response )-> typename std::decay<decltype(response->value.getPayload())>::type

Сейчас придут монстры типа RG45 и watchmaker и расскажут нам как делать правильно
Errare humanum est
Отредактировано 24.12.2020 6:58 Максим . Предыдущая версия . Еще …
Отредактировано 24.12.2020 6:57 Максим . Предыдущая версия .
Re: Чёт не рублю в современном C++, поможите, кто может
От: _NN_ www.nemerleweb.com
Дата: 25.12.20 12:18
Оценка: 4 (1) +1
Здравствуйте, Marty, Вы писали:

Вопрос, что именно нужно. В C++ нужно всегда уточнять.
Если требуется прокинуть как есть, то лучше использовать decltype(auto).
В отличии от auto это вернёт ссылку если getPayload возвращает ссылку.

int i;
int& g() { return i; }

decltype(auto) f() { return g(); }
auto f2() { return g(); }

f() = 1; // Работает
g2() = 1; // А так нет



Кстати, есть причина передавать response не по ссылке ?
Получается, что мы работаем с копией объекта.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Чёт не рублю в современном C++, поможите, кто может
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.12.20 16:57
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Вопрос, что именно нужно. В C++ нужно всегда уточнять.

_NN>Если требуется прокинуть как есть, то лучше использовать decltype(auto).
_NN>В отличии от auto это вернёт ссылку если getPayload возвращает ссылку.

спс


_NN>Кстати, есть причина передавать response не по ссылке ?

_NN>Получается, что мы работаем с копией объекта.

Да наверное нет, но тогда надо озаботиться, чтобы возвращалась не ссылка, потому что в 99.9999% случаев там аргументом будет результат другого непосредственного вызова
Маньяк Робокряк колесит по городу
Re[3]: Чёт не рублю в современном C++, поможите, кто может
От: Умака Кумакаки Ниоткуда  
Дата: 03.01.21 15:26
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Зашибись!

LVV>Паттерн Фабричный метод в одной строчке...

это вообще к паттерну `фабричный метод` не имеет никакого отношения
нормально делай — нормально будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.