144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

Как создать массив указателей на шаблонные функции

15.12.2020, 04:56. Показов 2865. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не редко возникает необходимость вызвать шаблонную функцию по индексу внутри шаблонной или простой функции.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2020, 04:56
Ответы с готовыми решениями:

Как создать массив из указателей на функции?
#include <iostream> using namespace std; const int SLEN = 30; struct student { char fullname; char hobby; int ooplevel; ...

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

Шаблонные ф-ции / массив указателей С++
Здравствуйте, такой вопрос возник. 1) знаю, что есть массив указателей вот пример: void a(int X) { cout << X; } //функция...

35
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.12.2020, 04:57
Студворк — интернет-сервис помощи студентам
Nexi99, в примере вы создаёте указатели на инстансы. С таким же успехом можно на простые функции создать массив указателей. Это не будет массивом указателей на шаблоны.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <functional>
using namespace std;
using std::cout;
using  std::cin;
using  std::endl;
 
void squire(int a)
{
   cout << a*a <<' ';
}
 
void inc(int a)
{
   cout << a+1 <<' ';
}
 
void show(int a)
{
   cout << a <<' ';
}
 
template<typename T>
using
fun=function< void (const T&) > ;
 
fun<int> arr_tmpl_ptr[3]={show, inc, squire};
 
//аналогично
 
function< void (const int&) > the_same_balls_view_aside[3]={show, inc, squire};
 
int main()
{
for(size_t i=0; i<3; ++i)arr_tmpl_ptr[i](2);
cout<<'\n';
for(size_t i=0; i<3; ++i)the_same_balls_view_aside[i](2);
 
    return 0;
}
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
16.12.2020, 06:06  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никаких особенностей тут нет.
Ну нет а я тупанул и так получилось
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.12.2020, 16:12
Nexi99, ваш текст трудно читается. Дело не только в отсутствии знаков препинания. Тут ни кто не безгрешен. Сам текст сложен для чтения как таковой. Я боюсь, что вы сами когда формулируете вопрос, понимаете своё видение не лучше чем те кто читает. Поэтому
Цитата Сообщение от Nexi99 Посмотреть сообщение
и так получилось
имеет место быть. Что касается шаблона функций и шаблонной функции, то большинство сходится к тому что второе - отравленный синоним. Точно также как константная ссылка (ссылка на константу) и много другое, что порождает гуманитарный склад мышления. Так что насчёт
Цитата Сообщение от Nexi99 Посмотреть сообщение
тупанул
вы не одиноки. Для шаблонов функций инстанс возможен путём только полной специализации шаблона - сам вызываемый (генерируемый по шаблону, исполняемый код) правильнее называть инстансом. А инстанс не отличается от простой функции в обсуждаемом контексте. Он вообще не (или мало чем) отличается от обычной функции. Не зависимо от того инстанс присутствует явно в или генерируется для точки вызова, на него можно взять адрес. Посмотрите тут например:
https://stackoverflow.com/ques... e-function

Croessmah, озвучте ваш -9 (гадость в данном контексте) с комментарием
Ну сколько можно бредить...
ваш пост в теме - юмор для гурманов.
Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель на заголовочный файл тоже создать нельзя...
Каюсь, но его даже я заплюсовал. Я обращаюсь не за объяснением ваших действий в мой адрес. Остаётся загадкой зачем вы предлагали дружбу (которую я отклонил и правильно сделал). Объясните - в чём вы увидели бред, столь жгущий, что вы использовали безрадостное (для нормальных людей) право минусования? Может участникам будет полезно узнать. Только без мелких придирок (из таких мотивов нормальные люди не минусуют), а по сути.

Добавлено через 1 час 13 минут
Nexi99, я добавил в пример шаблон, чтобы показать что инстанс работает наравне с обычними функциями.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <functional>
using namespace std;
using std::cout;
using  std::cin;
using  std::endl;
 
// явная специализация не потребуется
template<class T>
templ_cube(const T& t)
{
    cout << ( t*t*t )<<' ';
}
 
void squire(int a)
{
   cout << a*a <<' ';
}
 
void inc(int a)
{
   cout << a+1 <<' ';
}
 
void show(int a)
{
   cout << a <<' ';
}
 
template<typename T>
using
fun=function< void (const T&) > ;
 
fun<int> arr_tmpl_ptr[]={show, inc, squire, templ_cube<int>};
 
//аналогично
 
function< void (const int&) > the_same_balls_view_aside[ ]={show, inc, squire,  templ_cube<int>};
 
int main()
{
for(size_t i=0; i<4; ++i)arr_tmpl_ptr[i](2);
cout<<'\n';
for(size_t i=0; i<4; ++i)the_same_balls_view_aside[i](2);
 
    return 0;
}
Проблемы с компоновкой и разрешением перегрузки у инстансов имеют специфику по сравнению с обычным функциями и я написал
Цитата Сообщение от IGPIGP Посмотреть сообщение
инстанс не отличается от простой функции в обсуждаемом контексте. Он вообще не (или мало чем) отличается от обычной функции.
имея ввиду что отличия есть, но они вне данной темы)
0
16.12.2020, 19:58

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Я обращаюсь не за объяснением ваших действий в мой адрес.
Не под тем сообщением нажал, сорян. Я уже давно пожаловался сам на себя.

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.12.2020, 20:42

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Не под тем сообщением нажал, сорян. Я уже давно пожаловался сам на себя.
Croessmah, - хух... Не представляете как полегчало) Хрен с ними с баллами. Это ерунда. Жаль что долго не отвечали. И еще. У меня (за исключением 2-х -7 от настоящего ...) мнусовок всего 2 - ваша и еще одного, - приличного, кстати участника. Но он сразу и в личку написал, что ошибся.
Дело не в самих балах, а в том, что отзывы видны любому посетителю аккаунта. Иметь минусы с комментами типа - "бред", это же как плевок на лице носить.
Я как-то тоже ошибся и попросил медераторов (не помню кого) отозвать минусовый отзыв, но ни чего не вышло. Видимо, не просто это.
Я бы предложил такие ошибки исправлять следующим +отзывом. Не важно сколько - путь +2. Важно что бы
Цитата Сообщение от Croessmah Посмотреть сообщение
Не под тем сообщением нажал, сорян. Я уже давно пожаловался сам на себя.
было в комментарии.


Ну да ладно. Слава богу, - ошибка.
Croessmah,
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,550
16.12.2020, 20:50
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У тебя Log это указатель на функцию, а ты пытаешься ему присвоить указатель на метод класса.
а чем ТСу указатель на объект класса не угодил? (или в самом классе указатель this)
Цитата Сообщение от Croessmah Посмотреть сообщение
std::function
или лямбда... - достойная альтернатива указателю на функцию...
её ведь уже и в классе можно использовать вроде...
(его код не читала)
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,550
17.12.2020, 10:57
Цитата Сообщение от Nexi99 Посмотреть сообщение
всё равно имея такой массив функция будет работать быстрее т.к. будет выполняться строгое выражение из 6ти и понятное дело если в цикле такое запустить будет сильный выигрыш.
switch case - тоже может быть выражением из 6ти и тоже быстрее, чем if-else_if
Цитата Сообщение от Nexi99 Посмотреть сообщение
Массив шаблонных функций можно создавать на основании шаблонной функции в которой будет происходить работа в дальнейшем компилятор на основании функции сгенерирует нужный указатель
вот зачем так извращаться, если можно написать 6 нужных специализаций?.. или перегрузок лямбдами (по линку из соседней вашей ветки)
p.s.
в свете c++11 все уже уходят, как могут, от работы с указателями... имхо
p.p.s.
А ГЛАВНОЕ: вызов функции ВСЕГДА будет быстрее, чем выковыривать указатель на неё из массива и только потом вызывать её
=====
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У тебя Log это указатель на функцию, а ты пытаешься ему присвоить указатель на метод класса.
Указатели на функции, методы и члены данных
P.S.
ТСу: вы всё-таки язык начинаете изучать с конца (с template'ов)... начните с начала (хотя бы с указателей)...
P.P.S
и часть 1 до кучи - пример использования Интерфейсного класса IComparable в стиле C++ + OOP (на стр.7)... по сравнению с которым template, конечно, удобнее (т.к. даёт нужное в compile-time) ...
но всё-таки перегрузка шаблонных функций ещё проще, чем специализация шаблонов - когда надо и есть возможность
(хотя не знаю, указатели на какие функции вы в массив хотите заносить - разные или одну, но для разных типов)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.12.2020, 13:17
Невнимательно написал
C++
1
2
3
4
5
6
// явная специализация не потребуется
template<class T>
templ_cube(const T& t)
{
    cout << ( t*t*t )<<' ';
}
Ни одна студия (2008 и 2017) не обладает чувством юмора как впоследствии оказалось. Они совершенно обыденно отказываются это компилировать. А MinGW - компилирует как ни в чём не бывало. Не капризный ни разу. А компиляторам, которые это делают правильно студиям надо
C++
1
2
3
4
5
6
// явная специализация не потребуется
template<class T>
void templ_cube(const T& t)
{
    cout << ( t*t*t )<<' ';
}
Мелкомягкие затягивают в пучину комфорта. То ли дело - сообщество. С ним расслабляться нельзя)
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
19.12.2020, 21:44  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
switch case - тоже может быть выражением из 6ти и тоже быстрее, чем if-else_if
if-else_if быстрее чем switch case т.к. он был создан раньше и работает проще, да и зачем проверять 6ть выражений когда можно проверить 1но.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,550
20.12.2020, 07:00
del
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,550
20.12.2020, 07:00
Цитата Сообщение от Nexi99 Посмотреть сообщение
да и зачем проверять 6ть выражений когда можно проверить 1но.
вы не проверяете 6, а исходя из одного сразу идёте на нужный case... - опять азы и логика - где они у вас
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
20.12.2020, 07:31  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
вы не проверяете 6, а исходя из одного сразу идёте на нужный case... - опять азы и логика - где они у вас
Ну меня тоже интересовал вопрос что быстрее case... или if-else_if, мнения сильно расходятся, пишут что первый быстрее т.к. он проще да и по сути case можно представить как массив, программа производит прыжок в нужный вариант, так да мне интересно что быстрее.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.12.2020, 10:10
Цитата Сообщение от Nexi99 Посмотреть сообщение
Ну меня тоже интересовал вопрос что быстрее case... или if-else_if, мнения сильно расходятся, пишут что первый быстрее т.к. он проще да и по сути case можно представить как массив, программа производит прыжок в нужный вариант, так да мне интересно что быстрее.
Nexi99, кейсов может быть несколько и если вы не сделаете break то будут ещё вызовы. Но главное различие в том, что не все условия можно дискретизировать.
Как выяснилось существуют разные мнения на шаблон функций и шаблонную функцию как понятия.
1. Вы какого из них придерживаетесь?
2. И смогли ли вы написать указатель на шаблон?
3. Понимаете ли вы, что разные инстансы это разные типы и непосредственно их положить в массив невозможно?
Nexi99, я спрашиваю потому, что тема не раскрыта от слова - совсем. Она набрала некоторый рейтинг и становится ещё одной ссылкой в никуда.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
20.12.2020, 11:36  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
2. И смогли ли вы написать указатель на шаблон?
Да я выше показал что мне нужно, ранее не получалось, мне нужен был массив который хранит функции которые ещё не определены по типу и название темы написал правильно, раньше эксперементировал и видимо косячил.
Цитата Сообщение от IGPIGP Посмотреть сообщение
кейсов может быть несколько и если вы не сделаете break то будут ещё вызовы. Но главное различие в том, что не все условия можно дискретизировать.
Так что быстрее case... или if-else_if?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
20.12.2020, 15:06
Протестируйте!
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.12.2020, 17:55
Цитата Сообщение от Nexi99 Посмотреть сообщение
Да
Покажите же. Тема ведь:
Цитата Сообщение от Nexi99 Посмотреть сообщение
Как создать массив указателей на шаблонные функции?
Это значит, что сюда придёт много людей и найдёт то, что тут есть. Но указатель на шаблон это шаблонный тип указателя. Не полный тип - то есть. Это значит, что его следует конкретизировать чтобы сделать типом.
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
25
26
27
28
29
30
31
32
#include <iostream>
#include <string>
 
using std::cout;
using  std::cin;
using  std::endl;
//указатель на шаблон является шаблоном сам по себе
template <class T>
using void_fn_1_ParamPtr= void (const T&) ;
 
void fn(const int& a)
{
    cout<<a<<'\n';
}
 
void fn(const std::string & a)
{
    cout<<a<<'\n';
}
 
int main()
{
  //инстанцирование в корнкретные указатели
  void_fn_1_ParamPtr<int> *pf1=fn;
  void_fn_1_ParamPtr<std::string> *pf2=fn;
//это разные типы и положить их в массив непосредственно, не получится,
 
   pf1(123);
   pf2("456");
  
return 0;
}
и продолжить можно бы так:
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
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
 
using std::cout;
using  std::cin;
using  std::endl;
 
struct BaseFn_1_param_Ptr
{
    virtual void fn()=0;
    virtual ~BaseFn_1_param_Ptr(){}
 
};
 
template<class T> struct
TempleOfFunctor:public BaseFn_1_param_Ptr
{
    TempleOfFunctor(const T& t_)
    :t(t_)
    {
 
    }
    void fn(){cout<<t<<endl;}
    T t;
};
int main()
{  
  TempleOfFunctor<int> ti(123);
  TempleOfFunctor<std::string> tstr("345");
 
 BaseFn_1_param_Ptr *arr[] ={ &ti, &tstr };
 for(size_t i=0; i<2; ++i)arr[i]->fn();
 
return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2020, 17:55

Различные функции, для которых можно создать массив указателей на функции
Придумайте не менее 3-х различных функций, для которых можно создать массив указателей на функции.

Создать массив указателей на функции. Функции выполняют арифметические действия
Создать массив указателей на функции. Функции выполняют арифметические действия. Как это можно реализовать?

Создать массив из трех указателей на функции
Уважаемые форумчане, всем доброго времени суток. Очень прошу помочь написать программу, я пока не пойму с какой стороны к ней даже и...

Создать массив из указателей которые указывают на функции
Как можно создать массив из указателей которые указывают на функции?

Создать массив заданной размерности с помощью функции и указателей
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void z(int *p){ int a; for (int p=a;p&lt;a+*(p-1);p++){ ...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru