日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 带参数的宏定义实现反射机制

發布時間:2025/3/15 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 带参数的宏定义实现反射机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

lua 這種腳本語言用久了,總覺得反射機制就應該理所當然的嵌入在語言特性里。
比如希望根據自己傳的類型名變量,動態去 new 一些實例。在 lua ,js 里做起來就非常簡單,然而在 c++里面做起來,就需要稍微費些周折。
好在 c++ 宏定義 支持傳入參數, 仿佛就是專門給反射機制設計的。
寫的時候參考 cocos2dx CREATE_FUNC 這個宏

#define CREATE_FUNC(__TYPE__) \ static __TYPE__* create() \ { \__TYPE__ *pRet = new(std::nothrow) __TYPE__(); \if (pRet && pRet->init()) \{ \pRet->autorelease(); \return pRet; \} \else \{ \delete pRet; \pRet = NULL; \return NULL; \} \ }

我自己的需求是 ,把一個字符串事件名,對應到一個自定義的 command 類名上。

如果手寫,需要寫很多類似這樣長長的大同小異的代碼:

EventListenerCustom* listener = nullptr;listener = EventListenerCustom::create(GG_EVENT_TEST1, [=](EventCustom* event){TestCommand command;(&command)->execute(event);});_dispatcher->addEventListenerWithFixedPriority(listener, 1);listener = EventListenerCustom::create(GG_EVENT_ENTER_GAME, [=](EventCustom* event){EnterGameCommand command;(&command)->execute(event);});_dispatcher->addEventListenerWithFixedPriority(listener, 1);

定義一個這樣的宏,再寫起來就方便了:

#define MAP_EVENT_COMMAND(__EVENTNAME__,__COMMANDNAME__,__DISPATCHER__) \ {\EventListenerCustom* listener = nullptr; \listener = EventListenerCustom::create(__EVENTNAME__, [=](EventCustom* event){ \__COMMANDNAME__ command; \(&command)->execute(event); \ }); \__DISPATCHER__->addEventListenerWithFixedPriority(listener, 1); \ }

用的時候寫法要簡潔得多 :

MAP_EVENT_COMMAND(GG_EVENT_TEST1, TestCommand, _dispatcher) MAP_EVENT_COMMAND(GG_EVENT_ENTER_GAME, EnterGameCommand, _dispatcher)

轉載自:https://blog.csdn.net/korekara88730/article/details/68955408?utm_source=copy

總結

以上是生活随笔為你收集整理的c++ 带参数的宏定义实现反射机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。