Chinaunix

标题: 获取模板函数地址? [打印本页]

作者: scout2004    时间: 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);
}

各位有没比较好的解决思路?
作者: reiase    时间: 2008-03-03 21:45
模板函数根本就不存在于编译结果中。。。
作者: cjaizss    时间: 2008-03-03 22:11
讨论的人没有搞懂C++是如何编译的
另外这个也完全不属“算法”范畴

[ 本帖最后由 cjaizss 于 2008-3-3 22:13 编辑 ]
作者: chen17981    时间: 2008-03-04 07:16
模板没有实例化.
作者: whyglinux    时间: 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
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2