Отключить типизацию в С (С++)

Тема в разделе "LANGS.C", создана пользователем GoldFinch, 14 ноя 2008.

  1. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Легально и переносимо - не может. Все остальное хаки. Указатель на метод может вызываться через thrunk, быть составным и т.п. Размер указателя на член может быть больше чем sizeof(void*). Внутреннее устройство - это удел реализации (в VC вон, даже #pragma pointers_to_members есть).

    Это зависит от того что считать "использованием". boost::bind(&A::foo) ?
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Да. Но в простых случаях будет работать (вызов через thunk с коррекцией this компилятор делает при множественном наследовании виртуального метода). Тем более, что интересует не вызов метода, а только адрес для сплайсинга.

    Кстати, GCC (g++) позволяет вполне легально и переносимо вызывать метод pObj->Method как свободную ф-цию pMethod(pObj).

    Имеется в виду, что метод имеет спец. конвенцию вызова, с _неявной_ передачей указателя на объект и потому не может вызываться в отрыве от объекта.
    bind просто прячет вызов foo как метода внутрь функтора.
     
  3. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    Это и есть детали реализации. Один компилятор так, другой иначе.

    Речь была о другом. Да и под переносимостью обычно имеют понимают переносимоcть между компиляторами.

    Я имел ввиду что помимо непосредственно вызова функции, такие указатели можно копировать, сравнивать и т.д. другими словами - использование состоит не только в вызове.