如何在C++中打印方法指针的地址?

Dav*_*avi 7 c++

例如:

struct A { void m() { } };

void stream_print() {
  void(A::*p)(void) = &A::m;
  std::cerr << p << std::endl;
}

void printf_print() {
  void(A::*p)(void) = &A::m;
  fprintf(stderr, "%p", p);
}
Run Code Online (Sandbox Code Playgroud)

stream_print()函数总是打印"1",这显然不是我想要的.printf_print无法编译,因为p无法转换为void*.

我需要的是一个方法指针的唯一标识符,我可以存储在容器中.我知道这听起来不错,但我正在开发一种可以从中受益的单元测试小玩具.我不担心方法的重载,我知道如何获得指向特定重载的指针.

我正在使用启用了C++ 0x的g ++ 4.4.3.

如果您有任何疑问,请告诉我.

AnT*_*AnT 10

成员函数指针通常是具有非平凡内部结构的对象.这就是为什么你不能使用打印原始类型的工具打印它.将指针转换void *为不可行的方法,因为成员指针的大小通常大于sizeof(void *).void *在任何情况下强制转换它都会丢弃指针表示的一部分,从而不再保证唯一性.

如果您要查找的是从指针生成的唯一字符串,则可以将指针重新解释为字符数组,并使用标识符中字符值的字符串表示形式.就像是

void (A::*p)(void) = &A::m;

for (size_t i = 0; i < sizeof p; ++i)
  printf("%d ", reinterpret_cast<char *>(&p)[i]);

printf("\n");
Run Code Online (Sandbox Code Playgroud)