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)
。