c++ - 函数的模板推导如何在 C++ 中工作?
问题描述
我遇到了为事件调度程序编写的这段代码。它会首先检查事件的类型是否是它想要的类型,然后它将运行一个模板化的函数,并将事件作为其参数,我对该函数的参数语法有疑问(什么 (*( T*)&m_Event) 意思是,为什么在 T 之前有一个星号?为什么在 T 之后有一个星号?)
class EventDispatcher
{
template<typename T>
using EventFn = std::function<bool(T&)>;
public:
EventDispatcher(Event& event)
: m_Event(event)
{
}
template<typename T>
bool Dispatch(EventFn<T> func)
{
if (m_Event.GetEventType() == T::GetStaticType())
{
m_Event.m_Handled = func(*(T*)&m_Event);
return true;
}
return false;
}
private:
Event& m_Event;
};
解决方案
(T*)
是一种 C 风格的强制转换,在这里用于强制&m_Event
转换为指向 a 的指针T
。然后取消引用所有这些的结果(最左边的*
)。最后,这只是将对象的引用传递给m_Event
调用的一种可疑的复杂方式func
(除非我们应该注意一些运算符重载)。
一般来说,这段代码对我来说看起来不太好。这里需要这样的演员阵容这一事实令人担忧。很有可能这整个装置实际上是在调用未定义的行为,但很难说不知道是什么,例如,整体GetEventType()
和GetStaticType()
业务是关于什么的,这里涉及的所有类型实际上是什么......
PS:参数func
可能最好在这里通过引用传递。
推荐阅读
- pdf - Firefox 的 about:config 在 Android 上用于设置 pdf 应用程序
- javascript - SASS:嵌套图像滑块
- c++ - Sqrt、cos、sin 没有在这个范围内声明?
- css - 使用 ng build --prod 构建 angular 10 会抛出错误:需要一个伪类或伪元素
- matlab - MATLAB 表日期时间循环索引
- elasticsearch - 通过查询 Elasticsearch 调度更新
- javascript - 如果 X 在一个数字范围内,我如何为 X 分配一个数字?
- html - 如何定位背景颜色?
- python - 如何使用正则表达式排除一行中的特定单词?
- reactjs - React MongoDB MongoNetworkError: failed to connect to server on first connect [TypeError: net.createConnection is not a function]