2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
||||||
1 | ||||||
Передача шаблонной функции в качестве параметра02.04.2021, 09:41. Показов 4079. Ответов 19
Метки нет (Все метки)
Нужно передать функцию Maximum_Array_Element тип которой может меняться (int, double....) в функцию Maximum_Element_Of_Two_Arrays, заранее спасибо
0
|
02.04.2021, 09:41 | |
Ответы с готовыми решениями:
19
Передача функции в качестве параметра Передача функции в качестве параметра Передача CString в качестве параметра функции Передача лямбда-функции в качестве параметра |
440 / 283 / 183
Регистрация: 23.06.2018
Сообщений: 651
|
||||||
02.04.2021, 13:03 | 2 | |||||
Сообщение было отмечено solvo23 как решение
Решение
Ох... Скажите, а в чём смысл делать так много параметров шаблона?
1. В инициализации и тем более выводе массива вы ничего не возвращаете, там Type_Func не нужен, достаточно просто void возвращать.2. В Maximum_Array_Element достаточно вернуть T1 .3. И раз уж я начал придираться к параметрам, то есть ли вообще смысл делать шаблонным размер массива? Проверки на отрицательные числа нет, использовать дробные числа это извращение, а создавать разные функции потому что где-то можно сэкономить несколько байт... Сомнительное решение. Также из скромных ошибок: 1. Type_Func_2(*Maximum_Array_Element)() является указателем на функцию, которая ничего не принимает.2. Maximum_Element_Of_Two_Arrays/*<int, size_t, float, size_t>*/(ptr_Array_A, size_Array_A, ptr_Array_B, size_Array_B, Maximum_Array_Element(); вы открыли лишнюю скобку + из-за вашего Type_Func_1 вы не сможете автоматически вывести шаблон.Касательно передачи шаблонной функции - вы не передадите сам шаблон. Во время компиляции каждый уникальный шаблон создаёт свою уникальной функцию, следовательно для двух разных типов вам нужно принимать два разных указателя. Игнорируя мои жалобы к изобилию параметров шаблона, вот решение:
1
|
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
|
02.04.2021, 14:01 [ТС] | 3 |
Просто на занятиях дали меньше чем в статье которую прочитал вчера (о шаблонных функциях)
Поэтому и пытаюсь усвоить все что видел в этой статье, заодно решить задачу по передаче функции в функцию Спасибо за рекомендации пойду переосмысливать информацию
0
|
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
||||||
03.04.2021, 15:28 [ТС] | 4 | |||||
Попытался привести код в соответствии с рекомендациями
Все вроде работает, но хотел немного по другому Функция Maximum_Element_Of_Two_Arrays должна принять в качестве аргументов две функции Maximum_Array_Element тип данных у первой int у второй double и вернуть результат в том типе который принимает result и вот это, то не получается
0
|
440 / 283 / 183
Регистрация: 23.06.2018
Сообщений: 651
|
||||||
03.04.2021, 17:09 | 5 | |||||
Технически, в С++14 есть вывод возвращаемого типа, для этого надо просто поставить auto, но есть 2 проблемы:
1. Функция должна быть определена до её вызова (а не просто объявлена, как у вас). 2. Если вам придётся сдавать этот код, то подумайте, оценит ли принимающий такой трюк и будет ли доступен С++14 при демонстрации (на текущий момент, в VS2019 это минимальная версия стандарта, но не уверен на счёт остального). Код:
1
|
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
||||||
03.04.2021, 21:21 [ТС] | 6 | |||||
Ошибка C3779 "Maximum_Element_Of_Two_Arrays": функцию, возвращающую "auto" нельзя использовать, предварительно не определив
0
|
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
|
||||||
03.04.2021, 21:30 | 7 | |||||
solvo23, а зачем тебе вообще эти предварительные, они только загромождают код
1
|
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
|
03.04.2021, 21:54 [ТС] | 8 |
Все равно double возвращает
0
|
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
|
|||||||||||
03.04.2021, 22:11 | 9 | ||||||||||
может, так?
дык, а как же оно вернёт не double, если выражение "примет на вход" int и double, на "выходе" будет именно double как же ещё то ? Добавлено через 1 минуту тогда вот так
подправил
1
|
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
|
||||||
03.04.2021, 23:53 | 10 | |||||
Ну дык оно и нормально. Смысл-то не в самих типах, а в уходе от сужающих преобразований.
Или, например, выйдет что temp_A == 20, temp_B == 20.0 - и что с этим делать тогда? Можно, конечно, костылями покидаться: Кликните здесь для просмотра всего текста
0
|
18902 / 9860 / 2410
Регистрация: 30.01.2014
Сообщений: 17,306
|
||||||
04.04.2021, 00:58 | 11 | |||||
По-моему это уже за гранью.
Я бы еще понял, если бы предложено было так как-то:
0
|
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
|
|
04.04.2021, 05:25 | 12 |
А как-нибудь так можно в принципе?
Это ж как, без неконстант до самой свадьбы?
0
|
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
|
04.04.2021, 07:47 [ТС] | 13 |
Не сразу понял это
"Функция должна быть определена до её вызова (а не просто объявлена, как у вас)." Это означает что я должен не использовать предварительное объявление функции, а определить ее до функции main? Если так, то почти все получается
0
|
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
|
|
04.04.2021, 07:53 | 14 |
solvo23, если у функции в качестве типа возврата указан
auto или decltype(auto) , то тип выводится по первому встреченному в теле функции return , при этом все последующие return ы должны возвращать тип, который конвертируется в первый выведенный.в предварительном объявлении нет тела функции, соответственно возвращаемый тип не может быть выведен для этого предварительного объявления
0
|
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
|
04.04.2021, 08:54 [ТС] | 15 |
А выражении подобном этому принимает значение наибольшего типа данных?
auto temp_C = (temp_A > temp_B) ? temp_A : temp_B;
0
|
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
|
|
04.04.2021, 08:59 | 16 |
1
|
2 / 2 / 0
Регистрация: 05.02.2021
Сообщений: 158
|
|
04.04.2021, 09:02 [ТС] | 17 |
Понятно я то хотел что бы среди значения переменной double и значения переменной int выбрало одно и вернуло тип данных выбранного значения, получается нельзя
0
|
фрилансер
5504 / 5099 / 1048
Регистрация: 11.10.2019
Сообщений: 13,366
|
||||||
04.04.2021, 09:07 | 18 | |||||
solvo23,
2
|
18902 / 9860 / 2410
Регистрация: 30.01.2014
Сообщений: 17,306
|
|
04.04.2021, 11:44 | 19 |
В принципе - можно. Можно ли в этом конкретном случае - не важно, смысл примера в другом: тип у нас статический, на ходу он не меняется. Это самое важное, что нужно понимать при программировании на С++.
А я лишь хотел показать, что уход от статической типизации в сторону неконтролируемых умолчаний - это совсем не хорошо. Мы должны либо переносить контроль за типизацией на этап компиляции (как у меня в примере), либо переносить его на этап исполнения (как в примере #18).
1
|
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
|
||||||
04.04.2021, 13:58 | 20 | |||||
Это да, такой фокус у меня получилось провернуть только для глобальных констант.
Тут-то собака и закопана. Согласен, тыкать войдами и кастами во всякое - это "на худой конец", и пример плохой. Посещали мысли про кортежи, обёртки над union или нечтом, исходящим из чего-то вроде
0
|
04.04.2021, 13:58 | |
04.04.2021, 13:58 | |
Помогаю со студенческими работами здесь
20
Функции, передача массива в качестве параметра Передача временного массива в качестве параметра функции Передача функции в качестве параметра в другую функцию Передача функции с двумерным массивов в качестве параметра Передача функции в качестве параметра другой функции Передача указателя в качестве параметра функции динамически подключаемой библиотеки .so Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |