Là một phần của băm, tôi cần phải chuyển đổi một con trỏ hàm thành một biểu diễn chuỗi. Với chức năng toàn cầu/tĩnh nó tầm thường:Làm thế nào để có được biểu diễn chuỗi cho hàm thành viên?
string s1{ to_string(reinterpret_cast<uintptr_t>(&global)) };
Và từ here:
2) Bất kỳ con trỏ có thể được chuyển đổi sang bất kỳ loại không thể thiếu đủ lớn để giữ giá trị của con trỏ (ví dụ để
std::uintptr_t
)
Nhưng tôi có một vấn đề với chức năng thành viên:
cout << &MyStruct::member;
kết quả đầu ra 1
mặc dù trong trình gỡ lỗi tôi có thể thấy địa chỉ.
string s{ to_string(reinterpret_cast<uintptr_t>(&MyStruct::member)) };
Cung cấp lỗi biên dịch cannot convert
. Vì vậy, có vẻ như không phải bất kỳ con trỏ nào cũng có thể được chuyển đổi.
Tôi có thể làm gì khác để có được biểu diễn chuỗi?
'1' có thể là giá trị chính xác. Con trỏ hàm thành viên là tương đối, sau khi tất cả. Điều này cũng có nghĩa là bạn có thể gặp phải rất nhiều xung đột nếu bạn không thêm thông tin bổ sung như băm của typeid của chính loại đó. Và khi bạn nói rằng * không phải bất kỳ con trỏ nào cũng có thể được chuyển đổi *, hãy nhớ rằng con trỏ hàm thành viên * không * con trỏ; chúng chính xác là * con trỏ hàm thành viên *. –
"Vì vậy, có vẻ như không phải bất kỳ con trỏ nào cũng có thể được chuyển đổi. ..." Một con trỏ không giống với con trỏ tới thành viên, con trỏ có thể được chuyển đổi thành kiểu không thể tách rời, con trỏ thành thành viên không thể. – user657267
Không có toán tử '' nào cho con trỏ tới thành viên. '& MyStruct :: member' là một con trỏ không thành viên. Bất kỳ con trỏ nào cũng có thể được chuyển đổi thành 'bool'. Các con trỏ không null chuyển thành 'true', in theo mặc định là' 1'. – molbdnilo