- 论坛徽章:
- 0
|
C++ 中出现了 C 所没有的函数重载,故事从这里开始。
对于非模版函数,有如下函数定义:
那么可以用 &func 取函数的地址。这和 C 中没有什么差别。
如果是这样的函数重载:
- void func( int ) {}
- void func( double ) {}
- void func( int, double ) {}
复制代码
再用 &func 取函数的地址是错误的,因为没有足够的信息来决定选取哪个重载的函数。在提供了一个明确的上下文环境之后问题才能得到解决,如:
- static_cast<void(*)(int)>(&func);
- void (*pf3)( int, double ) = &func;
复制代码
&func 分别指的是第一和第三个函数的地址。
对于模版函数重载带来的类似的问题,C++ 提出了更高的要求:必须提供明确的上下文环境。一般函数调用中不存在上下文环境的问题,但是如 &func 这样的不带参数的形式中缺少函数参数信息。
考虑下面的模版函数重载:
- template <typename T>
- void func( T ) {}
- template <typename T>
- void func( T, int ) {}
复制代码
则 &func<int> 代表的是哪个重载函数就是模糊的。即使第二个模版函数的定义不存在,&func<int> 也是非法的。
>> printf("%x\n", &min<int>); // 这一行报错。
printf 是变参函数,&min<int> 所在的位置缺乏类型信息。可以通过强制类型转换以提供一个上下文环境使得对模版函数的取址合法:
- static_cast<void(*)(int)>(&func<int>) // Use the 1st function's address
- static_cast<void(*)(int, int)>(&func<int>) // Use the 2nd function's address
复制代码 |
|