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

标签 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);
}

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

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

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

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

最佳答案

成员函数指针一般是一个具有非平凡内部结构的对象。这就是为什么您不能使用用于打印原始类型的工具来打印它的原因。将指针转换为 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");

关于c++ - 如何在 C++ 中打印方法指针的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5367152/

相关文章:

c++ - 处理对继承的循环依赖

c++ - 给定一个 32 位数字,按某个因子缩放每个字节的有效方法是什么?

c++ - 返回对 DLL 中对象的引用

c++ - malloc() 和 malloc_consolidate() 中的段错误

c++ - 使用 NEW 而不是 MALLOC 的 GetAdapterAddresses 函数

c++ - 如何在 C++ 中丢弃 const

c++ - 如何在找到某个单词后解析数字

c++ - 获取 Eigen::vector 的标准差

c++ - 如何生成伪随机 32 字节字符串以用作加密哈希函数中的盐?

c++ - 从空指针初始化类/结构