12 / 12 / 12
Регистрация: 19.02.2014
Сообщений: 72

Шаблон указателя на функцию и шаблоны функций

12.03.2014, 10:42. Показов 5693. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, в чём проблема? Не смог разобраться.

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
48
49
50
51
52
53
54
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
template <typename T>
typedef bool (* TFunc)(T, T);   // пытаюсь создать шаблон указателя на функцию.
template <typename T>
bool Asc(T left, T right)       // функция, которая пригодится для сортировки по возростанию.
{ return left > right; }
template <typename T>
bool Desc(T left, T right)      // функция, которая пригодится для сортировки по убыванию.
{ return left < right; }
template <typename T>
void sort(T *pArr, int size, TFunc pFunc)   // сама сортировка (пузырьковым методом).
{
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size - 1 - i; ++j)
            if (pFunc(pArr[j], pArr[j+1]))
            {
                T temp = pArr[j];
                pArr[j] = pArr[j+1];
                pArr[j+1] = temp;
            }
}
int main()
{
    srand(unsigned (time(0)));
    int n = 10;
    int *pArr = new int [n];        // создается массив.
    for (int i = 0; i < n; ++i)
        pArr[i] = rand()%11;
    for (int i = 0; i < n; ++i)     // отображение массива.
        cout << pArr[i] << " ";
    cout << endl;
    cout << "Enter 1 to ordinate array in ascent\n"
            "and 2 - in descent:\n";
    int c;
    while (cin >> c)                // выбор 1 для сортировки по возростанию и 2 - по убыванию.
    {
        if (c == 1 || c == 2)
            break;
        cout << "Enter correct number! Try again:\n";
    }
    if (c == 1)
        sort (pArr, n, Asc);
    else
        sort (pArr, n, Desc);
    for (int i = 0; i < n; ++i)     // отображение отсортированного массива.
        cout << pArr[i] << " ";
    cout << endl;
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2014, 10:42
Ответы с готовыми решениями:

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

Шаблоны функций. Можно ли задать шаблон мэйна
Понятно что нельзя. В этом чудном участке кода, в мэйн вводимые данные кастятся к инту. Как это можно обойти?#include&lt;iostream&gt; ...

Шаблон указателя на функцию
Надо создать шаблон, который бы генерировал функцию, вызывающую другую функцию, которую я передал ей в шаблоне. Что - то похожее на это,...

14
Неэпический
 Аватар для Croessmah
18128 / 10712 / 2064
Регистрация: 27.09.2012
Сообщений: 27,002
Записей в блоге: 1
12.03.2014, 10:58
Цитата Сообщение от montkay Посмотреть сообщение
Подскажите пожалуйста, в чём проблема?
Эт Вы нам скажите в чем проблема то.
Цитата Сообщение от montkay Посмотреть сообщение
для сортировки по возростанию.
Цитата Сообщение от montkay Посмотреть сообщение
для сортировки по убыванию.
std::greater
std::less

C++
1
2
3
4
    if (c == 1)
        sort (pArr, n, Asc);
    else
        sort (pArr, n, Desc);
Asc и Desc - шаблоны
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2219 / 1421 / 415
Регистрация: 16.05.2013
Сообщений: 3,616
Записей в блоге: 6
12.03.2014, 11:01
А вы подумайте, что вы делаете. Для разных функций (с разными реализациями) вы объявляете один и тот же псевдоним. Т.е. как компилятор разберется в такой записи:
C++
1
2
3
4
5
6
//.....
bool f1(int, int);
bool f2(float, float);
//.....
TFunc = f1;
TFunc = f2;
0
Неэпический
 Аватар для Croessmah
18128 / 10712 / 2064
Регистрация: 27.09.2012
Сообщений: 27,002
Записей в блоге: 1
12.03.2014, 11:02
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
48
49
50
51
52
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
template <typename T>
bool Asc(T left, T right)       // функция, которая пригодится для сортировки по возростанию.
{ return left > right; }
template <typename T>
bool Desc(T left, T right)      // функция, которая пригодится для сортировки по убыванию.
{ return left < right; }
template <typename T,typename U>
void sort(T *pArr, int size, U pFunc)   // сама сортировка (пузырьковым методом).
{
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size - 1 - i; ++j)
            if (pFunc(pArr[j], pArr[j+1]))
            {
                T temp = pArr[j];
                pArr[j] = pArr[j+1];
                pArr[j+1] = temp;
            }
}
int main()
{
    srand(unsigned (time(0)));
    int n = 10;
    int *pArr = new int [n];        // создается массив.
    for (int i = 0; i < n; ++i)
        pArr[i] = rand()%11;
    for (int i = 0; i < n; ++i)     // отображение массива.
        cout << pArr[i] << " ";
    cout << endl;
    cout << "Enter 1 to ordinate array in ascent\n"
            "and 2 - in descent:\n";
    int c;
    while (cin >> c)                // выбор 1 для сортировки по возростанию и 2 - по убыванию.
    {
        if (c == 1 || c == 2)
            break;
        cout << "Enter correct number! Try again:\n";
    }
    if (c == 1)
        sort (pArr, n, Asc<int>);
    else
        sort (pArr, n, Desc<int>);
    for (int i = 0; i < n; ++i)     // отображение отсортированного массива.
        cout << pArr[i] << " ";
    cout << endl;
    return 0;
}
1
12 / 12 / 12
Регистрация: 19.02.2014
Сообщений: 72
12.03.2014, 12:24  [ТС]
Croessmah, виноват - не указал саму проблему =) Проблема находится в следующем:
C++
1
typedef bool (* TFunc)(T, T);
Именно в этом месте происходит ошибка при компиляции. А потом соответственно и в функции
C++
1
void sort(T *pArr, int size, TFunc pFunc)
Добавлено через 6 минут
Ilot, но ведь присваивание происходить не одновременно, а с помощью разветвления:
Цитата Сообщение от montkay Посмотреть сообщение
C++
1
2
3
4
if (c == 1)
     sort (pArr, n, Asc);
   else
     sort (pArr, n, Desc);
Добавлено через 7 минут
Сейчас я понял, что именно нужно сделать - правильно отобразить шаблон указателя на функцию:
C++
1
typedef bool (* TFunc)(T, T);
Именно из-за этого места не работают другие функции, мне кажется. Просто функции должны принимать любые типы данных - символы, числа целые и с плавающей точкой.
0
2371 / 1883 / 759
Регистрация: 27.07.2012
Сообщений: 5,509
12.03.2014, 12:24
Лучший ответ Сообщение было отмечено montkay как решение

Решение

Тайпдефы шаблонными не могут быть.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2219 / 1421 / 415
Регистрация: 16.05.2013
Сообщений: 3,616
Записей в блоге: 6
12.03.2014, 12:30
Цитата Сообщение от montkay Посмотреть сообщение
Ilot, но ведь присваивание происходить не одновременно, а с помощью разветвления:
И что? Вы не поняли сути. Объявляя замену типа шаблонным вы тем самым различным шаблонам присваиваете одно и тоже имя. Это почти тоже самое, что и сделать вот так:
C++
1
2
bool (* TFunc)(int, int);
bool (* TFunc)(float, float);
Поэтому компилятор этого не допускает.
1
12 / 12 / 12
Регистрация: 19.02.2014
Сообщений: 72
12.03.2014, 12:37  [ТС]
John Prick, Вы бесспорно правы =) Прочитал в интернете: "если нельзя, но очень хочется, то можно". Здесь нельзя применить какой-нибудь метод, чтобы сделать указатель на функцию шаблонным?

Добавлено через 1 минуту
Ilot, действительно какой-то бред получается =) Спасибо!
0
Неэпический
 Аватар для Croessmah
18128 / 10712 / 2064
Регистрация: 27.09.2012
Сообщений: 27,002
Записей в блоге: 1
12.03.2014, 12:42
Лучший ответ Сообщение было отмечено montkay как решение

Решение

Чем не устраивает код из поста #4?
Цитата Сообщение от montkay Посмотреть сообщение
Здесь нельзя применить какой-нибудь метод, чтобы сделать указатель на функцию шаблонным?
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
48
49
50
51
52
53
54
55
56
57
58
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
template < typename T >
struct TFunc {
   typedef bool (*type)(T,T) ;
} ;
 
template <typename T>
bool Asc(T left, T right)       // функция, которая пригодится для сортировки по возростанию.
{ return left > right; }
template <typename T>
bool Desc(T left, T right)      // функция, которая пригодится для сортировки по убыванию.
{ return left < right; }
template <typename T>
void sort(T *pArr, int size, typename TFunc<T>::type pFunc)   // сама сортировка (пузырьковым методом).
{
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size - 1 - i; ++j)
            if (pFunc(pArr[j], pArr[j+1]))
            {
                T temp = pArr[j];
                pArr[j] = pArr[j+1];
                pArr[j+1] = temp;
            }
}
 
int main()
{
    srand(unsigned (time(0)));
    int n = 10;
    int *pArr = new int [n];        // создается массив.
    for (int i = 0; i < n; ++i)
        pArr[i] = rand()%11;
    for (int i = 0; i < n; ++i)     // отображение массива.
        cout << pArr[i] << " ";
    cout << endl;
    cout << "Enter 1 to ordinate array in ascent\n"
            "and 2 - in descent:\n";
    int c;
    while (cin >> c)                // выбор 1 для сортировки по возростанию и 2 - по убыванию.
    {
        if (c == 1 || c == 2)
            break;
        cout << "Enter correct number! Try again:\n";
    }
    if (c == 1)
        sort (pArr, n, Asc<int>);
    else
        sort (pArr, n, Desc<int>);
    for (int i = 0; i < n; ++i)     // отображение отсортированного массива.
        cout << pArr[i] << " ";
    cout << endl;
    return 0;
}
1
2371 / 1883 / 759
Регистрация: 27.07.2012
Сообщений: 5,509
12.03.2014, 12:46
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T>
struct pointer_to_function_template
{
    typedef bool (*TFunc)(T, T);
}
 
bool func1(int, int);
bool func2(double, double);
bool func3(string, string);
 
pointer_to_function_template<int>::TFunc pFunc1 = func1;
pointer_to_function_template<double>::TFunc pFunc2 = func2;
pointer_to_function_template<string>::TFunc pFunc3 = func3;
2
12 / 12 / 12
Регистрация: 19.02.2014
Сообщений: 72
12.03.2014, 12:49  [ТС]
Croessmah, хороший код, но есть одно моё пожелание - хочется, чтобы шаблонный указатель принимал любые типы данных. А у Вашем коде нужно будет каждый раз изменять тип данных:
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
if (c == 1)
* * * * sort (pArr, n, Asc<int>);
* * else
* * * * sort (pArr, n, Desc<int>);
А так всё хорошо, согласен =)
0
2371 / 1883 / 759
Регистрация: 27.07.2012
Сообщений: 5,509
12.03.2014, 12:52
montkay, зачем вам в вашей задача вообще нужен шаблонный указатель на функцию? Шаблонная функция sort и без этого отлично разберётся, какой ей передаётся тип указателя.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2219 / 1421 / 415
Регистрация: 16.05.2013
Сообщений: 3,616
Записей в блоге: 6
12.03.2014, 12:55
Цитата Сообщение от montkay Посмотреть сообщение
Croessmah, хороший код, но есть одно моё пожелание - хочется, чтобы шаблонный указатель принимал любые типы данных. А у Вашем коде нужно будет каждый раз изменять тип данных:
Ну так уберите параметры шаблона. Для вызова функции они не обязательны:
C++
1
2
3
4
    if (c == 1)
        sort (pArr, n, Asc);
    else
        sort (pArr, n, Desc);
1
Неэпический
 Аватар для Croessmah
18128 / 10712 / 2064
Регистрация: 27.09.2012
Сообщений: 27,002
Записей в блоге: 1
12.03.2014, 13:18
Цитата Сообщение от montkay Посмотреть сообщение
А у Вашем коде нужно будет каждый раз изменять тип данных
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
template <typename T>
bool Asc(T left, T right)       // функция, которая пригодится для сортировки по возростанию.
{ return left > right; }
template <typename T>
bool Desc(T left, T right)      // функция, которая пригодится для сортировки по убыванию.
{ return left < right; }
template <typename T >
void sort(T *pArr, int size, bool (*pFunc)(T,T) )   // сама сортировка (пузырьковым методом).
{
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size - 1 - i; ++j)
            if (pFunc(pArr[j], pArr[j+1]))
            {
                T temp = pArr[j];
                pArr[j] = pArr[j+1];
                pArr[j+1] = temp;
            }
}
 
int main()
{
    srand(unsigned (time(0)));
    int n = 10;
    int *pArr = new int [n];        // создается массив.
    for (int i = 0; i < n; ++i)
        pArr[i] = rand()%11;
    for (int i = 0; i < n; ++i)     // отображение массива.
        cout << pArr[i] << " ";
    cout << endl;
    cout << "Enter 1 to ordinate array in ascent\n"
            "and 2 - in descent:\n";
    int c;
    while (cin >> c)                // выбор 1 для сортировки по возростанию и 2 - по убыванию.
    {
        if (c == 1 || c == 2)
            break;
        cout << "enter correct number! Try again:\n";
    }
    if (c == 1)
        sort (pArr, n, Asc);
    else
        sort (pArr, n, Desc);
    for (int i = 0; i < n; ++i)     // отображение отсортированного массива.
        cout << pArr[i] << " ";
    cout << endl;
    return 0;
}
1
12 / 12 / 12
Регистрация: 19.02.2014
Сообщений: 72
12.03.2014, 13:21  [ТС]
Croessmah, спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2014, 13:21
Помогаю со студенческими работами здесь

Шаблон RAII замены указателя на функцию
шаблон raii замены указателя на фукнцию допустим имеется набор указателей на функции разных типов и существует потребность временно,...

Написать функцию, используя шаблоны функций, организуйте ее работу с целыми и вещественными числами
Написать функцию, используя шаблоны функций, организуйте ее работу с целыми и вещественными числами. Организовать ее вызов в главной...

Написать функцию используя шаблоны функций, организуйте ее работу с целыми и вещественными числами
Написать функцию используя шаблоны функций, организуйте ее работу с целыми и вещественными числами. Организовать ее вызов в главной функции...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ?
Собсно. То есть ребята, вот пример отсюда: http://www.cplusplus.com/reference/algorithm/count_if/ // count_if example #include...


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

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

Новые блоги и статьи
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru