Есть ли способ перегрузить ->*
для использования с объектом, похожим на смарт-указатель? Ниже то, что я хотел бы сделать. Для простоты я не использую шаблоны (я вернусь к этому, как только у меня будет работать для одного фиксированного класса). Я могу заставить его работать с указателями на элементы данных, но я не могу сделать это правильно для указателей на функции-члены. В настоящее время я готов согласиться на перегрузку, которая работает только для функций-членов (а не для членов-данных). Я даже готов согласиться на перегрузку, которая принимает указатели на функции-члены только с одним фиксированным прототипом (таким как void func()
).
struct MyObject
{
void MyMethod() {}
};
struct MySmartPtr {
MyObject *p;
// What should the prototype and function body be?
// ??? operator->*(????) { ???? }
};
void MyFunc()
{
MyObject obj;
MySmartPtr obj_ptr;
obj_ptr.p = &obj;
void (MyObject::* member_func_ptr)() = &MyObject::MyMethod;
// Now call obj.MyMethod() through the "smart pointer"
(obj_ptr->*member_func_ptr)();
}
Пожалуйста, не предлагайте мне обходные пути (например, перегрузка *
и выполнение (*obj_ptr.*member_func_ptr)()
). Я хочу, чтобы ->*
работал, как указано во фрагменте кода.