如何在C++中打印成员函数地址

2024-04-04

看起来像std::cout无法打印成员函数的地址,例如:

#include <iostream>

using std::cout;
using std::endl;

class TestClass
{
  void MyFunc(void);

public:
  void PrintMyFuncAddress(void);
};

void TestClass::MyFunc(void)
{
  return;
}

void TestClass::PrintMyFuncAddress(void)
{
  printf("%p\n", &TestClass::MyFunc);
  cout << &TestClass::MyFunc << endl;
}

int main(void)
{
  TestClass a;

  a.PrintMyFuncAddress();

  return EXIT_SUCCESS;
}

结果是这样的:

003111DB
1

我怎样才能打印MyFunc的地址使用std::cout?


我不相信该语言提供任何设施来执行此操作。有过载operator <<让流正常打印void*指针,但成员函数指针不能转换为void*s。这都是特定于实现的,但通常成员函数指针被实现为一对值 - 一个指示成员函数是否为虚拟的标志,以及一些额外的数据。如果函数是非虚拟函数,则该额外信息通常是实际成员函数的地址。如果该函数是虚拟函数,则该额外信息可能包含有关如何索引虚拟函数表以查找要在给定接收者对象的情况下调用的函数的数据。

一般来说,我认为这意味着在不调用未定义行为的情况下不可能打印出成员函数的地址。您可能必须使用一些特定于编译器的技巧才能达到此效果。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在C++中打印成员函数地址 的相关文章

随机推荐