关于定义一个模板形式的函数指针类型的相关问题

ilovett 2005-09-02 02:33:10
关于定义一个模板形式的函数指针类型的相关问题

想写一个自己的通用排序函数,由于使用模板,
所以想把排序用的比较函数的函数指针也写成模板形式,
这里有点搞不懂了,怎么定义一个模板形式的函数指针类型?如(*)
这样以便比较时传入这个对应类型的比较函数指针。

下面这个程序就想用这个想法,但是(*)处编译不过,始终报错"模板不合法"。
请教各位朋友。


template<typename T>
typedef int (*fcmptype)(const T& t1,const T& t2);//(*)

template<typename T>
int mysort(T[] tarr,fcmptype f)
{
//.. 使用f来比较T[]内部元素大小
return 0;
}

int main(int argc, char* argv[])
{
//int[] t=new int[100];
//...
//mysort(...)
getchar();
return 0;
}
...全文
280 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovett 2005-11-17
  • 打赏
  • 举报
回复
up
ilovett 2005-09-05
  • 打赏
  • 举报
回复
谢谢各位,特别是 junguo:
to junguo:
您的
template<typename T>
T print(T i)
{
cout << i << endl;
}
template<typename T,int size,typename Opteration>
int mysort(T (&tarr)[size],Opteration f)
{...}
很好,其实我的目的是想定义一种函数指针的模板类型,用于规格化送入的函数f的原型
比如这样定义:
template<typename T>
typedef int _cmp(const T& t1,const T& t1);
可以定义送入的函数f满足送入的参数满足
1)两个同类型的用于比较的const量的引用
2)返回一个int
而您送入的是Opteration 没有任何的限制,不知道能否实现这个函数指针的模板类型?
非常感谢您的帮助,我还要继续请教一下。

to foochow:
谢谢提醒,我正在查这方面的书,没有看到相关的例子,如果你知道请说出来,谢谢!
foochow 2005-09-02
  • 打赏
  • 举报
回复
自己看看STL的书啊,上面好多这样的例子....
lyclowlevel 2005-09-02
  • 打赏
  • 举报
回复
再不是的话,改成以下就可以了:
#include <iostream>
using namespace std;
template<typename T1,typename T2>
int mysort(T1* tarr,int(*pfunc)(const T2 &a,const T2 &b))
{
//.. 使用f来比较T[]内部元素大小
return 0;
}

int main(int argc, char* argv[])
{
//int[] t=new int[100];
//...
//mysort(...)
getchar();
return 0;
}
在我的电脑上通过。
lyclowlevel 2005-09-02
  • 打赏
  • 举报
回复
to lyclowlevel:在(*)处就编译不过了,是定义模板形式的函数指针类型的问题。
==========================================================================
应该是你的编译器的问题,我在vc6.0时,按我的改法可以的。
bugebear3 2005-09-02
  • 打赏
  • 举报
回复
有点复杂

我以前在C下写过用函数指针来实现通用的哈希算法,对模板不熟悉,关注...
junguo 2005-09-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
template<typename T>
T print(T i)
{
cout << i << endl;
}

void printchar(char c)
{
cout << c << endl;
}
template<typename T,int size,typename Opteration>
int mysort(T (&tarr)[size],Opteration f)
{
//.. 使用f来比较T[]内部元素大小
for ( int i = 0;i<size;i++)
f(tarr[i]);
return 0;
}

int main(int argc, char* argv[])
{
int t[5]={1,2,3,4,5};;//=new int[100];
//...
//mysort(...)
char d[5] ={'a','b','c','d','e'};
mysort(t,print<int>);
mysort(d,print<char>);
getchar();
return 0;
}
你的意思是不是这个?
ilovett 2005-09-02
  • 打赏
  • 举报
回复
to lyclowlevel:在(*)处就编译不过了,是定义模板形式的函数指针类型的问题。
to junguo:
感谢您的回答,您的代码中的确也传入了不同的函数,达到了相应的效果。
int print(int i){ cout << i << endl;}
void printchar(char c){ cout << c << endl;}
但是我想问的就是怎么用模板的形式表达您的int,char,定义一个模板
比如
template<typename T>
typedef int _print(const T& t);
然后再利用这个模板来定义各个具体的类型的函数
e.g.
_print<char> printchar;
_print<int> printint;
但这样编译不过,我不知道模板形式的函数指针类型怎么写出来,继续请教!
lyclowlevel 2005-09-02
  • 打赏
  • 举报
回复
int mysort(T[] tarr,fcmptype f)
//其中的 T[] tarr是什么意思?应该是T*tarr吧?

如果将它改成:
int mysort(T* tarr,fcmptype f)
就可以了。
junguo 2005-09-02
  • 打赏
  • 举报
回复
简单写了一下,是根据stl上的源码的解决方法改的!应该符合你所需的功能!
junguo 2005-09-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int print(int i)
{
cout << i << endl;
}

void printchar(char c)
{
cout << c << endl;
}
template<typename T,int size,typename Opteration>
int mysort(T (&tarr)[size],Opteration f)
{
//.. 使用f来比较T[]内部元素大小
for ( int i = 0;i<size;i++)
f(tarr[i]);
return 0;
}

int main(int argc, char* argv[])
{
int t[5]={1,2,3,4,5};;//=new int[100];
//...
//mysort(...)
char d[5] ={'a','b','c','d','e'};
mysort(t,print);
mysort(d,printchar);
getchar();
return 0;
}

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧