Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

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

15.12.2020, 04:56. Показов 2854. Ответов 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,549
16.12.2020, 20:50
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У тебя Log это указатель на функцию, а ты пытаешься ему присвоить указатель на метод класса.
а чем ТСу указатель на объект класса не угодил? (или в самом классе указатель this)
Цитата Сообщение от Croessmah Посмотреть сообщение
std::function
или лямбда... - достойная альтернатива указателю на функцию...
её ведь уже и в классе можно использовать вроде...
(его код не читала)
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
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,549
20.12.2020, 07:00
del
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
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
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru