作为哈希的一部分,我需要将函数指针转换为字符串表示形式。使用全局/静态功能很简单:
string s1{ to_string(reinterpret_cast<uintptr_t>(&global)) };
从这里:
2)任何指针都可以转换为足以容纳该指针值的任何整数类型(例如to
std::uintptr_t
)
但是我对成员函数有疑问:
cout << &MyStruct::member;
输出,1
尽管在调试器中我可以看到地址。
string s{ to_string(reinterpret_cast<uintptr_t>(&MyStruct::member)) };
给出编译时错误cannot convert
。因此,似乎没有任何指针可以转换。
我还能做些什么来获得字符串表示形式?
cout << &MyStruct::member;
输出,
1
尽管在调试器中我可以看到地址。
没有的重载ostream::operator<<(decltype(&MyStruct::member))
。但是,成员函数指针可以隐式转换bool
为它,为此,存在一个重载,并且这是重载解析的最佳匹配。true
如果指针不为null,则转换后的值为。true
输出为1
。
string s{ to_string(reinterpret_cast<uintptr_t>(&MyStruct::member)) };
给出一个编译时错误,无法转换。因此,似乎没有任何指针可以转换。
可能令人困惑的是,在标准的指针中,并不是对象指针,成员指针,函数指针和成员函数指针的总称。指针专门意味着数据指针。
因此,引用的规则不适用于指向成员函数的指针。它仅适用于(对象)指针。
我还能做些什么来获得字符串表示形式?
您可以使用unsigned char
足够大的缓冲区来表示指针,并使用std::memcpy
。然后以您自己选择的格式打印。我建议使用十六进制。
正如Martin Bonner所指出的,指向成员的指针可能包含填充,在这种情况下,指向同一成员的两个值实际上在缓冲区中可能具有不同的值。因此,打印值用处不大,因为两个值在不知道填充哪些位(如果有)的情况下无法比较-这是实现方式定义的值。
不幸的是,我需要一个可靠的解决方案,因此由于这种填充,我无法使用。
没有便携式健壮的解决方案。
正如Jonathan Wakely指出的那样,Itanium ABI中没有填充,因此,如果您的编译器使用填充,则建议的memcpy方法将起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句