怎么得到一个模板函数指针

fldx 2009-05-05 01:50:47
怎么得到一个模板函数的指针?

C++ primer 3rd p413


#include <iostream>

using namespace std;

template<typename Type, int _size>
Type min(const Type (&arr)[_size])
{
/*......*/
}

typedef int (&rai)[10];
typedef double (&rad)[20];

void func(int (*)(rai));
void func(double (*)(rad));

int main()
{

func(static_cast<double (*)(rad)>(&min)); //c++ primer说这样可以,但在mingw中却报错
//invalid static_cast from type `<unknown type>' to type `double (*)(double (&)[20])

return 0;
}


怎么得到一个模板函数的指针???
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jinhao 2009-05-05
  • 打赏
  • 举报
回复
你说的常量表达式,这个信息已经包含在rad中了。


typedef double(&rad)[20];
^^


现在有了rad这个类型,已经有足够的信息来实例化min了,double和20都有了。

其次。lz代码的错误是因为min的类型是const double (&)[size],把const去掉就应该正常。
如果你用的编译器还继续报错,那你用的什么编译器?
lpf000 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Jinhao 的回复:]
引用 5 楼 lpf000 的回复:
我想是 带非类型形参的模板函数,必须显示实例化吧,对于这个形参const Type (&arr)[_size],_size必须通过实参实例化吧,像这样的形参编译的时候他需要验证实参的合法性;
可能是这样。。。。。。。


不需要,C++允许参数推断实例化.
static_cast <double (*)(rad)>(&min)
推断出min的模板参数,然后实例化,最后得到地址
[/Quote]
带非类型形参的函数模板,其非类型形参必须是编译时常量表达式,通过形参double (&rad)[20]只能推断出类型<double,int>吧,而这里的非类型形参需要常量表达式吧。。。
我试了很多,这样带非类型形参的的模板函数无法传递给函数指针。
taodm 2009-05-05
  • 打赏
  • 举报
回复
C++ Primer第三版中文版P414
Jinhao 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lpf000 的回复:]
我想是 带非类型形参的模板函数,必须显示实例化吧,对于这个形参const Type (&arr)[_size],_size必须通过实参实例化吧,像这样的形参编译的时候他需要验证实参的合法性;
可能是这样。。。。。。。
[/Quote]

不需要,C++允许参数推断实例化.
static_cast<double (*)(rad)>(&min)
推断出min的模板参数,然后实例化,最后得到地址
lpf000 2009-05-05
  • 打赏
  • 举报
回复
我想是 带非类型形参的模板函数,必须显示实例化吧,对于这个形参const Type (&arr)[_size],_size必须通过实参实例化吧,像这样的形参编译的时候他需要验证实参的合法性;
可能是这样。。。。。。。
lpf000 2009-05-05
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

template<typename Type>
Type min(Type& arr,Type& arr1);

//typedef int(&rai)[10];
//typedef double(&rad)[20];

void func(int (*)(int &a,int& b));
//void func(double (*)(double(&rad)[20]));

int main()
{

func(min<int>);

return 0;
}
这个可以 只有函数声明 只能编译
taodm 2009-05-05
  • 打赏
  • 举报
回复
楼主,C++ Primer 第三版P104 有你漏掉的知识点。
Sou2012 2009-05-05
  • 打赏
  • 举报
回复
MARK!!
lpf000 2009-05-05
  • 打赏
  • 举报
回复
帮顶
pengzhixi 2009-05-05
  • 打赏
  • 举报
回复
你的模版没实例化,怎么可能直接&min来得到地址.
Jinhao 2009-05-05
  • 打赏
  • 举报
回复
因为你的min的参数是const Type (&)[size]的
而你的static_cast里的rad不是const double (&)[20]的

65,211

社区成员

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

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