0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
|||||||||||
1 | |||||||||||
Оболочка для возвращаемого значения функции и std::optional03.03.2023, 14:02. Показов 1883. Ответов 20
Добрый день!
Есть вот такой код: Кликните здесь для просмотра всего текста
Нужно сделать оболочку для возвращаемого значения функции, даже если оно void. Также нужно уведомить пользователя о том, что было исключение, для этого используется std::option. Пока что так: Кликните здесь для просмотра всего текста
0
|
03.03.2023, 14:02 | |
Ответы с готовыми решениями:
20
Ключевое слово const для возвращаемого значения из функции Самый простой PHP код для вызова хранимой функции PostgreSQL и вывода возвращаемого значения? std::optional<T> при std::is_destructible_v<T> == false Тип возвращаемого значения функции Вывод возвращаемого значения функции |
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
|
||||||
03.03.2023, 17:49 | 2 | |||||
Сообщение было отмечено NanoCase как решение
Решение
Что-то в этом духе
1
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
||||||
03.03.2023, 22:02 [ТС] | 3 | |||||
Хорошее решение. Но в языке следующий код является валидным:
Кликните здесь для просмотра всего текста
Думаю что можно как-то сыграть от этого при помощи SFINAE и приведений типов.
0
|
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
|
|
03.03.2023, 22:37 | 4 |
Выражением prvalue типа void нельзя инициализировать объект. Так что либо
if constexpr , либо то же самое, только через специализацию какого-нибудь "инвокера".
1
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
|
03.03.2023, 22:52 [ТС] | 5 |
Понял. Спасибо за ответ!
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
08.03.2023, 21:51 | 6 | |||||
Сообщение было отмечено zayats80888 как решение
Решение
Можно сыграть.
Вот без специализаций и условий.
2
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
|
09.03.2023, 23:54 [ТС] | 7 |
DrOffset, т.е. перегружая оператор запятая у нас появляется возможность вывести возвращаемое значение функции в виде шаблона и если на 7 строчке провал подстановки то мы инициализируем Ret пустышкой?
0
|
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
|
|
10.03.2023, 00:52 | 8 |
Ага, только не на 7, а на 6 (точнее, на этапе формирования списка кандидатов в перегрузи).
И на 19 строчке в конструктор optional нужно передать объект Dummy, иначе результат неотличим от того, что в строке 22.
2
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
10.03.2023, 06:53 | 9 |
Сообщение от zayats80888
1
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
||||||
11.03.2023, 22:14 [ТС] | 10 | |||||
zayats80888 DrOffset, продолжаю улучшать оболочку, хочу чтобы функцию можно было вызывать из объекта, т.е. сохраняем в классе указатель на вызывающую сторону, когда хотим вызвать проверяем указатель на nullptr и вызываем соответствующий вариант функции. Но такой подход походу не работает, компилятор выдает ошибку. Можете направить меня в нужную сторону, пожалуйста
Кликните здесь для просмотра всего текста
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
11.03.2023, 22:16 | 11 |
NanoCase, у вас же есть std::function, нет нужды вводить разграничение на уровне вызова, когда можно его спрятать на уровне создания функтора.
1
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
|
11.03.2023, 22:32 [ТС] | 12 |
DrOffset, в std::function можно указывать вызывающую сторону?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
11.03.2023, 22:38 | 13 | |||||
В std::bind или в лямбде можно.
Вот вариант:
1
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
||||||
12.03.2023, 00:44 [ТС] | 14 | |||||
DrOffset, Вроде разобрался. Спасибо!
Добавлено через 1 час 25 минут DrOffset, проблемка вылезла, std::bind нужны placeholders на все аргументы вызываемой функции, вроде как решается заменой bind на аналогичную лямбду, с захватом функции и caller. Вот решение близкое к правде, но он ругается на сам вызов функции в лямбде Кликните здесь для просмотра всего текста
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
12.03.2023, 00:55 | 15 | |||||
NanoCase, синтаксис вызова через указатель на метод другой. Плюс забыли forward
1
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
|
12.03.2023, 02:46 [ТС] | 16 |
DrOffset, Заработало, спасибо
Добавлено через 1 час 8 минут DrOffset, у меня ещё вопрос созрел(возможно глупый). Допустим я хочу передать в качестве параметра функции shared_ptr, который должен скопироваться в оператор() и следовательно в пользовательскую функцию. Можно ли это решить без перегрузок оператора() и тотального переписывания кода?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
12.03.2023, 12:40 | 17 | |||||
А в чем проблема?
0
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
||||||
12.03.2023, 13:49 [ТС] | 18 | |||||
DrOffset, gcc 12.2 ошибку выдает на ваш код:
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
12.03.2023, 14:03 | 19 | |||||
NanoCase, так не на мой, а на ваш. Вы же сами класс изменили. У вас оператор теперь не соответствует новому подходу. Надо так:
0
|
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
|
||||||
12.03.2023, 14:14 [ТС] | 20 | |||||
DrOffset, я думал вы не меняли описание враппера. дело в том что такая реализация будет принимать все по значению, даже если нужно чтобы оператор принял что то по ссылке. но я уже понял что перегружать по универсальной ссылке смысла мало. решил это добавлением дополнительного уровня косвенности, что то типо такого:
0
|
12.03.2023, 14:14 | |
12.03.2023, 14:14 | |
Помогаю со студенческими работами здесь
20
Функции (вызов и тип возвращаемого значения) Структура в качестве возвращаемого значения функции Ошибка с приведением возвращаемого из функции значения Действие, зависящее от возвращаемого значения функции Выводится адрес функции вместо возвращаемого значения Тип возвращаемого значения не соответствует типу функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |