首页 > 解决方案 > 使用 reinterpret_cast 向下转换

问题描述

我是一个喜欢深入细节的人。这次我创建了非常简单的功能,我称之为“场景”(在下面查找代码)。首先,我将向您介绍我对它的看法:

struct ScenarioContext
{ virtual ~ScenarioContext() = default; };

struct IScenarioStep
{
    virtual ~IScenarioStep() = default;
    virtual void run( ScenarioContext& ) = 0;
};

struct ScenarioContainer final
{
    std::list<std::unique_ptr<IScenarioStep>> m_scenarioStepList;
};

struct Scenario
{
    explicit Scenario( ScenarioContainer&&, std::unique_ptr<ScenarioContext>&& = nullptr );

    void execute(); // Runs the steps one by one and passes context ref to steps

    std::unique_ptr<ScenarioContext> m_context;
    ScenarioContainer                m_container;
};

现在示例“ScenarioStep”实现:

struct SimpleContext
    : ScenarioContext
{
    bool isFirstStepDone  = false;
    bool isSecondStepDone = false;
    bool isThirdStepDone  = false;
};

struct ScenarioStep
    : IScenarioStep
{
    void run(ScenarioContext& ctx) override
    {
        auto THE_ISSUE = dynamic_cast<SimpleContext&>(ctx);
    }

};

在这里我得出结论,用户/开发人员绝对不可能得到错误类型的上下文。在这里用错了reinterpret_cast吗?如果是,为什么?绝对零成本在这里非常诱人。

如果没有reinterpret_cast,那怎么static_cast办?

我真的很困惑我们可以使用的所有这些“不要”的工具。

标签: c++performancecastingdowncast

解决方案


reinterpret_cast永远不应该用于降低类层次结构,因为它不进行基指针调整,这在多重继承的情况下会非常困难。

static_cast如果他们可以通过某种方式确定真正的对象类型与预期的对象类型匹配,则可以(并且应该!)使用。static_cast当不需要调整基本指针时,仍然是 0 成本,并且在需要时可以正常工作(尽管有成本)。


推荐阅读