Можно-ли создать указатель на шаблон функции?
Здравствуйте! Я хотел-бы знать, можно-ли (если можно, то как?) создать указатель на шаблон функции и использовать его например в качестве параметра другой функции? И можно-ли использовать в таком случае typedef?
Такой указатель создать нельзя, т.к. шаблон функции это не функция, а инструкция компилятору сгенерировать спектр функций. Соответственно невозможен тип указателя на шаблон функции. Такой указатель можно объявить после подстановки конкретного типа вместо class Type, только тогда у функции появится адрес.
Код:
#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;
}
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;
}
Нельзя. Template существует только в исходном коде. В исполняемый код попадает экземпляр (instance) шаблона, специализированного конкрентными типами. Соответственно typedef тоже нельзя сделать.
Возможно, поможет полиморфизм.
template <class T> T f(T x);
int Y,X=1;
y=f(X);
int (*pf)(int)=f;
Цитата: phase
template <class T> T f(T x);
int Y,X=1;
y=f(X);
int (*pf)(int)=f;
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);
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);
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);
Почитай Новые сложные задачи на C++ Герб Саттер 2005 год, там на все вопросы ответы даны
Цитата: 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;
}
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;
}
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;
}