【发布时间】:2015-10-02 13:55:24
【问题描述】:
这行太长了:
btnNickname = TWeakObjectPtr<UButton>(Cast<UButton>(WidgetTree->FindWidget(FName(STRINGIFY(btnNickname))));
对于定义为的变量:
TWeakObjectPtr<UButton> btnNickname;
我想创建宏来减少代码:
FIND_WIDGET(btnNickname);
有什么办法吗?
我现在使用这个代码:
#define FIND_WIDGET(TYPE, NAME) NAME = TWeakObjectPtr<TYPE>(Cast<TYPE>(WidgetTree->FindWidget(FName(STRINGIFY(NAME)))))
但是宏有两个参数。我可以从TWeakObjectPtr 变量中获取指针类型吗?
decltype 可以给我变量的类型,但不能给我指针的数据类型。
物质:
#define FIND_WIDGET(NAME) NAME = TWeakObjectPtr<decltype(*NAME)>(Cast<decltype(*NAME)>(WidgetTree->FindWidget(FName(STRINGIFY(NAME)))))
但这不起作用。
附: TWeakObjectPtr 是虚幻引擎 4 中使用的智能指针。
【问题讨论】:
-
空白(包括新行)是免费的!使用它们而不是宏
-
我对虚幻智能指针不熟悉,但智能指针通常具有它们所管理的对象的类型定义在其中。所以你应该可以从指针的类型中得到它。
-
我有一个关于从模板化对象中提取类型的类似问题:stackoverflow.com/q/31429363/2642059 那里接受的答案指出 C++ 标准类提供了
typedefs,它们被定义为模板参数,因此它们可以以后可以参考。也许TWeakObjectPtr有类似的typedef? -
宏很烂。直接说不吧。
-
@JonathanWakely 我几乎普遍同意你的观点,但我不得不说,出于调试目的,
STRINGIFY非常有帮助。
标签: c++ pointers macros smart-pointers decltype