获取重载函数的地址

其实只要让编译器确认了你所要取的值是什么,它自然会帮你取得。只是在我们取得函数指针时是不可以指明参数的,这样子我们该如何告诉编译器我们需要神马呢?

在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址.

下面是引用一段delphi解释如何获取重载函数指针的,其实C++中原理是一样的。

其实在C++中我们同样可以使用该种方法。首先定义一个指定了参数类型的指针,然后使用取地址符和函数名去取得函数地址。这样子我们通过一种间接的方式告诉了编译器我们是需要具有特定参数的函数,它便可以帮我们取得了。

C++中取得重载函数的方法

void func(){};
void func(const char* , int){};
// 定义一个欲获取的函数类型的指针
void (*funcpointer)(const char* , int);
// 取得重载函数地址.
funcpointer= func;


在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址.




代码文件:


unitUnit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs;typeTForm1 =class(TForm)procedureFormCreate(Sender: TObject);end;varForm1: TForm1;implementation{$R .dfm}{先举例两个重载函数}functionMyFun(s:string):string;overload;beginResult := s;end;functionMyFun(i: Integer):string;overload;beginResult := IntToStr(i);end;{分别获取重载函数的地址}procedureTForm1.FormCreate(Sender: TObject);type{需要先定义两个方法类型, 参数分别对应上面的重载函数}TF1 =function(s:string):string;TF2 =function(i: Integer):string;varf1: 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

不定参函数重载 函数的地址如何获取???至今未知



原文链接: https://www.cnblogs.com/dongzhiquan/archive/2011/07/13/2104808.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/28576

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午6:05
下一篇 2023年2月8日 上午6:05

相关推荐