Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
9 / 7 / 2
Регистрация: 26.12.2018
Сообщений: 278

Шаблонные ф-ции / массив указателей С++

10.05.2019, 16:12. Показов 1449. Ответов 19

Студворк — интернет-сервис помощи студентам
Здравствуйте, такой вопрос возник.
1) знаю, что есть массив указателей
вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void a(int X) { cout << X; } //функция а
void b(int X) { cout << "B"; } //функция b
void c(int X) { cout << "C"; } //функция с
 
 
 
int main()
{
    int x = 100;
    void(*P[3])(int) = { a,b,c }; //Массив из 3-х указателей на функции c параметром типа int
 
    (*P[0])(x); //Обращение к элементу массива вызывает функцию
 
    cin.get();
 
    return 0;
}
Но проблема в том, что указатели все должны быть одного типа - интовые, иначе будет ошибка.


2) думал, что на поддержку придет шаблонная ф-ция.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
template<typename T>
T add(T x, T y)
{
    return x + y;
}
int main()
{
    double a1 = 4.7, b1 = 5.3;
    double n1 = add(a1, b1);
 
    int a2 = 4, b2 = 5;
    int n2 = add(a2, b2);
 
    short a3 = 3, b3 = 2;
    short n3 = add(a3, b3);
 
    std::cout << "n1: " << n1 << std::endl; 
    std::cout << "n2: " << n2 << std::endl;
    std::cout << "n3: " << n3 << std::endl;
 
    return 0;
}
вот пример, да оно работает, но возник такой интересный вопрос, а можно ли обратиться к элементам при помощи указателя? пытался сделать - выводит ошибку, может кто то знает.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2019, 16:12
Ответы с готовыми решениями:

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

19
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.05.2019, 16:24
Цитата Сообщение от Anton006 Посмотреть сообщение
Но проблема в том, что указатели все должны быть одного типа - интовые, иначе будет ошибка.
Не обязательно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void a(int X) { cout << X; } //функция а
void b(double X, int Y) { cout << X + Y; } //функция b
void c(char X) { cout << X; } //функция с
 
 
 
int main()
{
    int x = 100; double y = 1.5; char ch = 'X';
    void* P[3] = { a,b,c }; //Массив из 3-х указателей на функции c параметром типа int
 
    static_cast<void(*)(int)>(P[0])(x); //Обращение к элементу массива вызывает функцию
    static_cast<void(*)(double, int)>(P[1])(y, x);
    static_cast<void(*)(char)>(P[2])(ch);
    cin.get();
 
    return 0;
}
0
9 / 7 / 2
Регистрация: 26.12.2018
Сообщений: 278
10.05.2019, 16:26  [ТС]
а как можно реализовать с разными типами? подскажите пожалуйста
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.05.2019, 16:27
шаблонная функция не имеет адреса, адрес будет у конкретной специализации
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 16:49
Цитата Сообщение от zayats80888 Посмотреть сообщение
Не обязательно:
не скомпилится.
К чему все эти приседания?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.05.2019, 17:00
Цитата Сообщение от Azazel-San Посмотреть сообщение
не скомпилится.
Хмм... А почему у меня компилится?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 17:23
Цитата Сообщение от zayats80888 Посмотреть сообщение
Хмм... А почему у меня компилится?
незнаю. Какой у вас компилятор?
У вас функции с разными параметрими и их кол-вом.
Массив указателей функций так не работает.

Добавлено через 43 секунды
Цитата Сообщение от zayats80888 Посмотреть сообщение
//Массив из 3-х указателей на функции c параметром типа int
И если память не изменяет это не массив указателей на функции.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.05.2019, 17:31
Цитата Сообщение от Azazel-San Посмотреть сообщение
незнаю. Какой у вас компилятор?
vc++ v141
Цитата Сообщение от Azazel-San Посмотреть сообщение
Массив указателей функций так не работает.
так у меня массив нетипизированных указателей
Цитата Сообщение от Azazel-San Посмотреть сообщение
И если память не изменяет это не массив указателей на функции.
это не я писал
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
10.05.2019, 17:34
Цитата Сообщение от zayats80888 Посмотреть сообщение
Массив из 3-х указателей на функции
В общем случае указатель на функцию не обязан приводится к void *.

Добавлено через 46 секунд
https://stackoverflow.com/ques... sting-in-c
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 17:37
Цитата Сообщение от Croessmah Посмотреть сообщение
В общем случае указатель на функцию не обязан приводится к void *.
Это случаем не UB?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
10.05.2019, 17:44
Цитата Сообщение от Azazel-San Посмотреть сообщение
Это случаем не UB?
Оно просто не будет компилироваться
В void * могут быть преобразованы указатели на объектные типы:
A prvalue of type “pointer to cv T”, where T is an object type, can be converted to a prvalue of type “pointer to cv void”. The pointer value (6.7.2) is unchanged by this conversion.
Конвертация указателя на функцию в void * поддерживается условно.
Её смысл и результат определяется реализацией:
Converting a function pointer to an object pointer type or vice versa is conditionally-supported. The meaning of such a conversion is implementation-defined, except that if an implementation supports conversions in both directions, converting a prvalue of one type to the other type and back, possibly with different cv-qualification, shall yield the original pointer value.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 17:48
Вот так катит
C++
1
2
3
4
5
6
7
8
9
10
11
void a(int) { } 
void b(double, int) { } 
void c(char) { } 
 
int main() {
    int x = 100; double y = 1.5; char ch = 'X';
    void* pfunc[3]{(void*)a, (void*)b, (void*)c};
    reinterpret_cast<void(*)(int)>(pfunc[0])(x); 
    reinterpret_cast<void(*)(double, int)>(pfunc[1])(y, x);
    reinterpret_cast<void(*)(char)>(pfunc[2])(ch);
}
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Конвертация указателя на функцию в void * поддерживается условно.
Да, я уже посмотрел сам

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
определяется реализацией
Ну, как знать, намного ли это лучше UB
С другой стороны зачем с этим всем приседать?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
10.05.2019, 17:52
Цитата Сообщение от Azazel-San Посмотреть сообщение
С другой стороны зачем с этим всем приседать?
Например, тот же dlsym возвращает именно void *.
На POSIX платформе конвертация будет поддерживаться, т.к. того POSIX требует (емнип, конечно же).
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
10.05.2019, 17:53
Azazel-San, там случаем не
C++
1
2
3
4
5
    int x = 100; double y = 1.5; char ch = 'X';
    void* pfunc[3]{(void*)(&a), (void*)(&b), (void*)(&c)};
    (*reinterpret_cast<void(*)(int)>(pfunc[0]))(x); 
    (*reinterpret_cast<void(*)(double, int)>(pfunc[1]))(y, x);
    (*reinterpret_cast<void(*)(char)>(pfunc[2]))(ch);
Всё таки преобразуем к указателю на функцию, а не к самой функции...
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.05.2019, 17:54
Цитата Сообщение от TRam_ Посмотреть сообщение
Всё таки преобразуем к указателю на функцию, а не к самой функции...
имя функции и есть указатель
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
10.05.2019, 17:56
Цитата Сообщение от zayats80888 Посмотреть сообщение
имя функции и есть указатель
Имя функции - это имя функции, как бы странно это не звучало.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 18:02
Цитата Сообщение от Croessmah Посмотреть сообщение
Например, тот же dlsym возвращает именно void *.
Но ми же пишем на С++, а не на Си)))
Цитата Сообщение от Croessmah Посмотреть сообщение
На POSIX платформе конвертация будет поддерживаться, т.к. того POSIX требует (емнип, конечно же).
Но как я понимаю всеравно гарантии 100% работоспособности нету?
На какой архитектуре можно словить маслину? ))

Добавлено через 2 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
там случаем не
Вроде как неявно это должно произойти, не?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
10.05.2019, 18:05
Цитата Сообщение от Azazel-San Посмотреть сообщение
Но ми же пишем на С++, а не на Си
Но функции с C-интерфейсом из dll'ок вызывать-то надо.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
10.05.2019, 18:17
Croessmah, кстати, а в Си такой каст UB как я вижу?
Casts between pointer-to-function and pointer-to-object in C and C++
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
10.05.2019, 18:31
Цитата Сообщение от Azazel-San Посмотреть сообщение
а в Си такой каст UB как я вижу?
Угу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2019, 18:31
Помогаю со студенческими работами здесь

Массив из указателей на масив из указателей на массив из int)
Доброго времени суток! Возникла проблема - как на C++ создать массив из указателей на массив из указателей на int? То есть массив из n...

Передача ф-ции как параметра другой ф-ции
struct pupil{ char surname; int school; int answer; int num; } tmp, a; int usl(int i, pupil a) { }

Шаблонные функции. Массив
как сделать функции шаблонными? подскажите пожалуйста, уже всё пробовал из вот этого#include &lt;iostream&gt; using namespace std; ...

Массив. Сортировка. Ф-ции
:-#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; #include &lt;ctime&gt; #define n 11 //константы #define k 10 ...

Ф-ция принимает массив ф-ции возвращает последний элемент. Выполнить в виде макрос
Помогите пожалуйста


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru