Насчет фигни какой-то - конечно фигня и в реальной жизни так делть не надо, но это же просто головоломка.
Насчет "если вызываемая функция обращается к переменным класса" - ЭТА функция не обращается, а задачка именно про нее. Если обращается - будет segmentation fault (я лично проверил).
Насчет "сделать статической" - это конечно да, но тогда теряется изюминка
Насчет эмпирической константы - это, конечно, некрасиво, но, в общем, правильно.
Раз народу задачка понравилась - я в пятницу опубликую "правильный" ответ. Правильность его в том, что он не замешан на эмпирику, не зависит от изменений в классе (при условии, что прототип функции сохранен) и, вроде как, ни в одной строке не противоречит синтаксису
А пока - принимаю варианты
oav писал(а): ↑21.03.2006 11:13
Указатель на член класса, в зависимости от платформы и компилятора (включая даже разные версии одного и тогоже компилятора) имеет размер от 8 до 20 байт. Решение задачи стандартными и переносимыми способами не существует. Если все-таки ее надо решить в реальнойсти, то можно почитать Fast Delegats на codeproject.com или вообще взять boost::function через boost::bind - что позволит получить симантику вызова обычной функции, а в реальности вызовется мембер класса (через бинд привезать this)
Да еще размер указателя зависит от множественнего наследования, виртуального насладевания и наличия виртуальных функций - т.е. число 12 будет различаться даже для разных классов

И тем не менее платформонезависимое решение есть

В каждом из нас спит гений... и с каждым днем все крепче...