获取重载函数的地址
其实只要让编译器确认了你所要取的值是什么,它自然会帮你取得。只是在我们取得函数指针时是不可以指明参数的,这样子我们该如何告诉编译器我们需要神马呢?
在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址.
下面是引用一段delphi解释如何获取重载函数指针的,其实C++中原理是一样的。
其实在C++中我们同样可以使用该种方法。首先定义一个指定了参数类型的指针,然后使用取地址符和函数名去取得函数地址。这样子我们通过一种间接的方式告诉了编译器我们是需要具有特定参数的函数,它便可以帮我们取得了。
C++中取得重载函数的方法
void func(){}; void func(const char* , int){}; // 定义一个欲获取的函数类型的指针 void (*funcpointer)(const char* , int); // 取得重载函数地址. funcpointer= func;
在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址.
代码文件:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} {先举例两个重载函数} function MyFun(s: string): string; overload; begin Result := s; end; function MyFun(i: Integer): string; overload; begin Result := IntToStr(i); end; {分别获取重载函数的地址} procedure TForm1.FormCreate(Sender: TObject); type {需要先定义两个方法类型, 参数分别对应上面的重载函数} TF1 = function(s: string): string; TF2 = function(i: Integer): string; var f1: TF1; {对应重载一} f2: TF2; {对应重载二} s1,s2: string; begin f1 := MyFun; {让 f1 指向重载一} f2 := MyFun; {让 f2 指向重载二} {测试函数} s1 := f1('abc'); s2 := f2(123); ShowMessageFmt('%s, %s', [s1,s2]); {abc, 123}
{前两个值分别是两个重载函数的地址; 第三个值是根据函数名获取的, 它和第一种重载的地址相同} ShowMessageFmt('%p, %p, %p', [@f1, @f2, @MyFun]);
{另一种方法} ShowMessageFmt('%p, %p, %p', [Addr(f1), Addr(f2), Addr(MyFun)]); {如果是类 published 区中的方法, 也可以用 MethodAddress 获取地址} end; end.
2012-10-24 07:45 | DZQABC
不定参函数重载 函数的地址如何获取???至今未知