免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4274 | 回复: 4
打印 上一主题 下一主题

[算法] 获取模板函数地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-03 19:36 |只看该作者 |倒序浏览
  在CSDN上见过别人讨论,讨论不出个结果出来。

编译失败的例子代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

template <class Type>
Type min(Type a, Type b)
{
    return (a < b ? a : b);
}

int main(int argc, char *argv[])
{
    printf("%x\n", &min<int>);          // 这一行报错。
    return (0);
}

各位有没比较好的解决思路?

论坛徽章:
0
2 [报告]
发表于 2008-03-03 21:45 |只看该作者
模板函数根本就不存在于编译结果中。。。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2008-03-03 22:11 |只看该作者
讨论的人没有搞懂C++是如何编译的
另外这个也完全不属“算法”范畴

[ 本帖最后由 cjaizss 于 2008-3-3 22:13 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-03-04 07:16 |只看该作者
模板没有实例化.

论坛徽章:
0
5 [报告]
发表于 2008-03-06 22:58 |只看该作者
C++ 中出现了 C 所没有的函数重载,故事从这里开始。

对于非模版函数,有如下函数定义:
  1. void func( int ) {}
复制代码

那么可以用 &func 取函数的地址。这和 C 中没有什么差别。

如果是这样的函数重载:
  1. void func( int ) {}
  2. void func( double ) {}
  3. void func( int, double ) {}
复制代码

再用 &func 取函数的地址是错误的,因为没有足够的信息来决定选取哪个重载的函数。在提供了一个明确的上下文环境之后问题才能得到解决,如:
  1. static_cast<void(*)(int)>(&func);
  2. void (*pf3)( int, double ) = &func;
复制代码

&func 分别指的是第一和第三个函数的地址。

对于模版函数重载带来的类似的问题,C++ 提出了更高的要求:必须提供明确的上下文环境。一般函数调用中不存在上下文环境的问题,但是如 &func 这样的不带参数的形式中缺少函数参数信息。

考虑下面的模版函数重载:

  1. template <typename T>
  2. void func( T ) {}

  3. template <typename T>
  4. void func( T, int ) {}
复制代码

则 &func<int> 代表的是哪个重载函数就是模糊的。即使第二个模版函数的定义不存在,&func<int> 也是非法的。

>> printf("%x\n", &min<int>);          // 这一行报错。

printf 是变参函数,&min<int> 所在的位置缺乏类型信息。可以通过强制类型转换以提供一个上下文环境使得对模版函数的取址合法:
  1. static_cast<void(*)(int)>(&func<int>) // Use the 1st function's address
  2. static_cast<void(*)(int, int)>(&func<int>) // Use the 2nd function's address
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP