这行太长了:
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)))))
但这是行不通的。
PSTWeakObjectPtr
是虚幻引擎4中使用的智能指针。
我希望它不起作用的原因decltype(*NAME)
是引用类型,因此您需要删除引用:
std::remove_reference_t<decltype(*NAME)>
或者您可以执行以下操作:
std::remove_pointer_t<decltype(NAME.operator->())>
但是无论如何,您都不应该使用宏。宏会闻到气味,父母会指向您,并告诉他们的孩子不要靠近使用宏的坏人。编写C ++,而不是宏。
编译器可以轻松推断出对象的类型:
template<typename T>
inline void
find_widget(TWeakObjectPtr<T>& t, const char* name)
{
t = TWeakObjectPtr<T>(Cast<T>(WidgetTree->FindWidget(FName(name))));
}
进而:
find_widget(foo, STRINGIFY(foo));
这更加灵活,因为您还可以执行以下操作:
find_widget(foo, "something else");
NBfind_widget
对于修改其论点的东西来说似乎不是一个很好的名字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句