使用参数包自动执行 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);