Автор Гілка: [c++] як зберігати покажчик на метод класу  (Прочитано 6434 раз)

Відсутній lpi3

  • Новачок
  • *
  • дописів: 30
  • Карма: +0/-0
  Вітаю!
  Як відомо у С і у С++ будь-який покажчик можна кастувати у void *. Але у С++ це не працює з покажчиками на методи класу. У випадку, якщо мені не потрібно знати тип даних, я завжди можу кастувати покажчик у void * і зберігати його (питання чи треба так робити залишаю осторонь, цікавить саме технічна можливість таке робити). А як же бути з покажчиками на методи? Чи існує технічна можливість зберігати їх десь у загальному випадку?
  Я знаю, що краще не оперувати чимось на зразок (MyObject::*method_ptr) (), а використовувати або віртуальні методи, або std::function<..> з лямбдами, або метапрограмування, але мене цікавить саме технічна можливість. У когось є ідеї? Дякую.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3739
  • Карма: +9/-0
  • Програміст
Покажчик на метод класу — це так званий «товстий вказівник» (fat pointer), який у даному випадку складається з двох вказівників — один вказує на клас, а другий на сам метод. Насправді «товстий вказівник» це не вказівник, а структура з вказівником і якимись додатковими даними чи вказівниками. Структуру привести до вказівника не можливо.
[Fedora Linux]

Відсутній lpi3

  • Новачок
  • *
  • дописів: 30
  • Карма: +0/-0
Дякую, та я так і зрозумів, що там насправді два вказівника, один на метод, а інший на якісь дані (vtable наприклад, якщо метод віртуальний). так ось питання саме в тім, чи існує такий загальний тип вказівники, до якого можна привести вказівник на будь який вказівник на метод будь якого класу (fat pointer).
Тобто і  'struct Data *' і 'int *' o 'float **' і будь який інший вказівник на дані можна привести до 'void *'. А чи існує загальний запис для вказівників на методи (generic fat pointer чи якось так)? Щось типу 'void (::*)()' чи якесь таке до чого можна привести і '&Object1::member1()' і '&Object2::member2(int)' наприклад?

Я так дивлюсь для них взагалі  каст працює з обмеженнями. Таке не те що б UB, а навіть не компілюється
Код: C
  1. typedef void (B::*methodptr) ();
  2. unsigned char mem[sizeof(methodptr)];
  3. methodptr x = (methodptr)mem;
Схоже, що це глухий кут у еволюції с++ :)


Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3739
  • Карма: +9/-0
  • Програміст
так ось питання саме в тім, чи існує такий загальний тип вказівники, до якого можна привести вказівник на будь який вказівник на метод будь якого класу (fat pointer).

Якби така можливість існувала, то це б прибрало можливість компілятору робити оптимізацію коду. Тобто теоритично це можна дозволити у компіляторі, але на практиці це боляче вдарить по усім через значне сповільнення усього об'єктно-орієнтованого коду.
[Fedora Linux]