使用参数包自动执行 dynamic_cast 检查
Using parameter packs to automate dynamic_cast checks
我正在尝试在 GUI 中实现通信系统。出于可维护性原因,我想避免访问者模式。同样,制作 dynamic_cast if else 语句也是不可维护的。我最接近的是使用 Scott Meyers 的 More Effective C++ 中的表实现多重分派。
到目前为止我有:
SubmitCommand(BaseCommand* pCommand)
{
m_Distpatcher->Dispatch<DerivedCommand1>(pCommand);
m_Distpatcher->Dispatch<DerivedCommand2>(pCommand);
m_Distpatcher->Dispatch<DerivedCommand3>(pCommand);
}
我想去的地方是:
SubmitCommand(BaseCommand* pCommand)
{
m_Distpatcher->Dispatch<DerivedCommand1,
DerivedCommand2,
DerivedCommand3>(pCommand);
}
其中 dispatch 是一种自动检查 dynamic_cast 传入命令结果的方法。
template<typename K>
void Dispatch(ICommand* pCommand)
{
auto pConcreteCommand = dynamic_cast<K*>(pCommand);
if (pConcreteCommand)
{
//call Recieve on the interface of the owner class
m_pInstance->Recieve(pConcreteCommand);
}
}
在这种情况下,将在编译时检查特定模块,以确保它具有针对模板中每个参数的函数。代码块 2 可能吗?
你可以这样做:
template <typename ... Ts>
void Distpatcher::Dispatch(BaseCommand* pCommand)
{
(DispatchUnique<Ts>(pCommand), ...); // C++17
}
所以
m_Distpatcher->Dispatch<DerivedCommand1,
DerivedCommand2,
DerivedCommand3>(pCommand);
相当于
m_Distpatcher->DispatchUnique<DerivedCommand1>(pCommand);
m_Distpatcher->DispatchUnique<DerivedCommand2>(pCommand);
m_Distpatcher->DispatchUnique<DerivedCommand3>(pCommand);
我正在尝试在 GUI 中实现通信系统。出于可维护性原因,我想避免访问者模式。同样,制作 dynamic_cast if else 语句也是不可维护的。我最接近的是使用 Scott Meyers 的 More Effective C++ 中的表实现多重分派。
到目前为止我有:
SubmitCommand(BaseCommand* pCommand)
{
m_Distpatcher->Dispatch<DerivedCommand1>(pCommand);
m_Distpatcher->Dispatch<DerivedCommand2>(pCommand);
m_Distpatcher->Dispatch<DerivedCommand3>(pCommand);
}
我想去的地方是:
SubmitCommand(BaseCommand* pCommand)
{
m_Distpatcher->Dispatch<DerivedCommand1,
DerivedCommand2,
DerivedCommand3>(pCommand);
}
其中 dispatch 是一种自动检查 dynamic_cast 传入命令结果的方法。
template<typename K>
void Dispatch(ICommand* pCommand)
{
auto pConcreteCommand = dynamic_cast<K*>(pCommand);
if (pConcreteCommand)
{
//call Recieve on the interface of the owner class
m_pInstance->Recieve(pConcreteCommand);
}
}
在这种情况下,将在编译时检查特定模块,以确保它具有针对模板中每个参数的函数。代码块 2 可能吗?
你可以这样做:
template <typename ... Ts>
void Distpatcher::Dispatch(BaseCommand* pCommand)
{
(DispatchUnique<Ts>(pCommand), ...); // C++17
}
所以
m_Distpatcher->Dispatch<DerivedCommand1,
DerivedCommand2,
DerivedCommand3>(pCommand);
相当于
m_Distpatcher->DispatchUnique<DerivedCommand1>(pCommand);
m_Distpatcher->DispatchUnique<DerivedCommand2>(pCommand);
m_Distpatcher->DispatchUnique<DerivedCommand3>(pCommand);