How to get string representation for the member function?

时间:2016-04-25 08:46:46

标签: c++ casting function-pointers

As a part of hashing, I need to convert a function pointer to a string representation. With global/static functions it's trivial:

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

And from 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)

But I have a problems with member functions:

cout << &MyStruct::member;

outputs 1 though in debugger I can see the address.

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?

1 个答案:

答案 0 :(得分:4)

cout << &MyStruct::member;
     

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

ostream::operator<<(decltype(&MyStruct::member))没有超载。但是,成员函数指针可以隐式转换为bool,为此,存在重载,这是重载决策的最佳匹配。如果指针不为null,则转换后的值为truetrue输出为1

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

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

也许令人困惑的是,在标准指针中,它不是对象指针,指向成员的指针,指向函数的指针和指向成员函数的指针的总称。指针仅指数据指针。

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

  

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

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

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

  

不幸的是我需要一个强大的解决方案,所以因为这个填充我无法使用。

不存在便携式强大的解决方案。

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