C++ 中的聚合初始化
Aggregate initialization in C++
我有一个基础 class 事件,从中导出具体事件:
struct Event
{
};
struct CollisionEvent : Event
{
//CollisionEvent(Entity entityA, Entity entityB) : entityA(entityA), entityB(entityB) {}
Entity entityA;
Entity entityB;
};
这个class是一个POD,我应该能够执行聚合初始化。但是下面的代码编译失败:
called from application:
eventBus->DispatchEvent<CollisionEvent>(mEntities[i], mEntities[j]);
in EventBus.h:
template <typename TEvent, typename... Args>
void DispatchEvent(Args&&... args)
{
auto it = mEventHandlers.find(typeid(TEvent));
if (it != mEventHandlers.end())
for (auto &&eventHandler : it->second)
eventHandler->Invoke(TEvent{ std::forward<Args>(args)... });
}
说它不能将初始化列表转换为 TEvent。为什么?
对于聚合初始化,您需要初始化基 class,即使它是空的。
eventBus->DispatchEvent<CollisionEvent>(Event{}, mEntities[i], mEntities[j]);
在最近的标准中关于什么是聚合和什么不是聚合也有一些变化 - 在 C++17 之前,具有基数 class 的 class 不能被聚合初始化,所以你不能让它在 C++14 中工作。 (参见 https://godbolt.org/z/Pq5PfecKq)
我有一个基础 class 事件,从中导出具体事件:
struct Event
{
};
struct CollisionEvent : Event
{
//CollisionEvent(Entity entityA, Entity entityB) : entityA(entityA), entityB(entityB) {}
Entity entityA;
Entity entityB;
};
这个class是一个POD,我应该能够执行聚合初始化。但是下面的代码编译失败:
called from application:
eventBus->DispatchEvent<CollisionEvent>(mEntities[i], mEntities[j]);
in EventBus.h:
template <typename TEvent, typename... Args>
void DispatchEvent(Args&&... args)
{
auto it = mEventHandlers.find(typeid(TEvent));
if (it != mEventHandlers.end())
for (auto &&eventHandler : it->second)
eventHandler->Invoke(TEvent{ std::forward<Args>(args)... });
}
说它不能将初始化列表转换为 TEvent。为什么?
对于聚合初始化,您需要初始化基 class,即使它是空的。
eventBus->DispatchEvent<CollisionEvent>(Event{}, mEntities[i], mEntities[j]);
在最近的标准中关于什么是聚合和什么不是聚合也有一些变化 - 在 C++17 之前,具有基数 class 的 class 不能被聚合初始化,所以你不能让它在 C++14 中工作。 (参见 https://godbolt.org/z/Pq5PfecKq)