c++ - 如何获取成员函数的字符串表示形式?

标签 c++ casting function-pointers

作为散列的一部分,我需要将函数指针转换为字符串表示形式。对于全局/静态函数,这很简单:

string s1{ to_string(reinterpret_cast<uintptr_t>(&global)) };

来自here :

2) Any pointer can be converted to any integral type large enough to hold the value of the pointer (e.g. to std::uintptr_t)

但是我对成员函数有疑问:

cout << &MyStruct::member;

虽然在调试器中我可以看到地址,但输出 1

string s{ to_string(reinterpret_cast<uintptr_t>(&MyStruct::member)) };

给出编译时错误无法转换。所以似乎不是任何指针都可以转换。

我还能做些什么来获得字符串表示形式?

最佳答案

cout << &MyStruct::member;

outputs 1 though in debugger I can see the address.

ostream::operator<<(decltype(&MyStruct::member)) 没有过载.但是,成员函数指针可以隐式转换为 bool为此,存在一个重载,这是重载解析的最佳匹配。转换后的值为true如果指针不为空。 true输出为 1 .


string s{ to_string(reinterpret_cast<uintptr_t>(&MyStruct::member)) };

Gives a compile-time error cannot convert. So it seems that not any pointer can be converted.

也许令人困惑的是,在标准语言中,指针 并不是对象指针、指向成员的指针、指向函数的指针和指向成员函数的指针的总称。指针具体指的只是数据指针。

因此,引用的规则不适用于指向成员函数的指针。它仅适用于(对象)指针。


What else can I do to get a string representation?

您可以使用 unsigned char 的缓冲区, 大到足以表示指针,并使用 std::memcpy .然后以您自己选择的格式打印。我推荐十六进制。

正如 Martin Bonner 指出的那样,指向成员的指针可能包含填充,在这种情况下,指向同一成员的两个值在缓冲区中实际上可能具有不同的值。因此,打印的值没有多大用处,因为两个值在不知道哪些位(如果有)正在填充的情况下不可比较 - 这是实现定义的。


Unfortunately I need a robust solution so because of this padding I can't use.

不存在可移植稳健的解决方案。

正如 Jonathan Wakely 指出的那样,Itanium ABI 中没有填充,因此如果您的编译器使用它,那么建议的 memcpy 方法就可以工作。

关于c++ - 如何获取成员函数的字符串表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36835772/

相关文章:

c++ - 根据键字符串使用迭代器更改嵌套映射的 int 值

c++ - 任何编译器真的会删除这些拷贝吗?

c - 从 32 位数字中提取字节

c - 隐式和显式转换

c++ - 在 C++ 中使用函数指针调用函数

c++ - 指向 const 的指针与通常的指针(对于函数)

c++ - 继承构造函数(使用)和移动

c++ - 出现 'bad_weak_ptr' 错误

php - 将 String 与 Integer 进行比较会得出奇怪的结果

c - 不需要在结构中的函数指针声明中指定参数的 C99 是否正确?