В Cocos2D-X исходный код есть некоторый код, который обрабатывает указатели на функции-члены, показанные ниже.
...
#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)
...
typedef void(CCObject::* SEL_MenuHandler )(CCObject *)
...
Идея, которую я собираю, состоит в том, чтобы использовать menu_selector(<MyClass>::<MyFunction>)
получить совместимый указатель на функцию. Но Я считаю, что использование приведения в стиле C позволяет им выполнять небезопасные приведения и приводить к возможному неопределенному поведению.. Я здесь не прав?
Только что у моего коллеги возникла проблема с кодом ниже
class HelloWorld:public CCObject{
void function();
}
....., menu_selector(HelloWorld::function)); //last arg to another function call
Этот код выдал ошибку недопустимого преобразования на VS2010, так как CCObject *
параметр обязателен, но не на компиляторах IOS или Android (не знаю, сколько лет мобильным компиляторам). Я сам проверил это с некоторым похожим кодом и фактически получил его для компиляции с VS2010 ..
Я спрашиваю, есть ли причина cocos2d-x
использует (TYPE)
вместо static_cast<TYPE>
? static_cast
заблокировал бы все такие незаконные забросы. Это потому что static_cast
заблокирует преобразование из (HelloWorld::*...)
в (CCObject::*...)
?
Редактировать: Преобразование указателя функции производного класса в указатель функции базового класса static_cast
кажется законным, так что я не знаю, почему они выбирают (TYPE)
,
Задача ещё не решена.
Других решений пока нет …