Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Можно-ли создать указатель на шаблон функции?

83K
24 июля 2012 года
phase
3 / / 18.07.2012
Здравствуйте! Я хотел-бы знать, можно-ли (если можно, то как?) создать указатель на шаблон функции и использовать его например в качестве параметра другой функции? И можно-ли использовать в таком случае typedef?
446
24 июля 2012 года
Meander
487 / / 04.09.2011
Такой указатель создать нельзя, т.к. шаблон функции это не функция, а инструкция компилятору сгенерировать спектр функций. Соответственно невозможен тип указателя на шаблон функции. Такой указатель можно объявить после подстановки конкретного типа вместо class Type, только тогда у функции появится адрес.
277
25 июля 2012 года
arrjj
1.7K / / 26.01.2011
На шаблон функции - нельзя. На экземпляр функции - можно:
Код:
#include <iostream>
template <class T> T f(T x){ return x+1;}
int (*fint)(int);
char (*fchar)(char);
int main()
{
fint=f<int>;
fchar=f<char>;
std::cout<<fint(10)<<" "<<fchar('a')<<std::endl;
return 0;
}
412
24 июля 2012 года
grgdvo
323 / / 04.07.2007
Нельзя. Template существует только в исходном коде. В исполняемый код попадает экземпляр (instance) шаблона, специализированного конкрентными типами. Соответственно typedef тоже нельзя сделать.
341
25 июля 2012 года
Der Meister
874 / / 21.12.2007
Возможно, поможет полиморфизм.
83K
25 июля 2012 года
phase
3 / / 18.07.2012
Понятно. Надо сначала инициализировать функцию, вызвав её, а потом создать указатель определённого типа. Например так:
template <class T> T f(T x);
int Y,X=1;
y=f(X);
int (*pf)(int)=f;
446
25 июля 2012 года
Meander
487 / / 04.09.2011
Нет, то, что ты написал:
Цитата: phase
template <class T> T f(T x);
int Y,X=1;
y=f(X);
int (*pf)(int)=f;


врятле, будет работать. Но и я немного затупил.
Что касается шаблона функции, то такие функции можно только вызывать, больше ничего с ними не сделать:

Код:
//определяем обобщенный (абстрактный) алгоритм
template <class T>
T f(T x){
//опереции с иксом;
return величина типа T;
}
//где-то он нам понадобился:
int a, b = 5; string c, d = "www";
//используем:
a = f(b);
c = f(d);
Вот и все, что можно сделать.
Что касается указателей на функции, им можно присваивать адреса разных функций, но построенных по одному прототипу:
Код:
int f1(int x){//что то делаем возвращаем int}
int f2(int x){//что то делаем возвращаем int}
int f3(int x){//что то делаем возвращаем int}
//и т.д.
//и определяем указатель на функцию:
int (*pf)(int);
//или лучше тип указателя:
typedef int (*Fpointer)(int);
//потом создать массив этого типа
Fpointer pf[3];
//инициализировать его адресами функций:
pf[0] = &f1;
pf[1] = &f2;
pf[2] = &f3;
//и в нужный момент вызывать:
int a, b = 2;
if(...) a = pf[0](b);
if(...) a = pf[1](b);
if(...) a = pf[2](b);
Но касаемо шаблонов, можно обьявить шаблонный класс, затем создать экземпляры с нужным типом и создать на них указатели. А уже через эти указатели обрашаться к методам экземпляров, параметры и возвращаемые значения которых будут нужного типа.
446
25 июля 2012 года
Meander
487 / / 04.09.2011
Почитай Новые сложные задачи на C++ Герб Саттер 2005 год, там на все вопросы ответы даны
83K
25 июля 2012 года
phase
3 / / 18.07.2012
Цитата: arrjj
На шаблон функции - нельзя. На экземпляр функции - можно:
Код:
#include <iostream>
template <class T> T f(T x){ return x+1;}
int (*fint)(int);
char (*fchar)(char);
int main()
{
fint=f<int>;
fchar=f<char>;
std::cout<<fint(10)<<" "<<fchar('a')<<std::endl;
return 0;
}


Спасибо!

p.s
Оказывается можно даже так:

Код:
#include <iostream.h>
template <class T> T f(T x){ return x+1;}
int (*fint)(int);
char (*fchar)(char);
int main()
{
fint=f;
fchar=f;
std::cout<<fint(10)<<" "<<fchar('a')<<std::endl;
system("pause");
return 0;
}

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог