使用 reinterpret_cast 进行向下转换
Downcasting with 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);
}
};
我得出的结论是,user/developer 绝对不可能得到错误类型的上下文。是不是这里用错了reinterpret_cast
?如果是,为什么?绝对零成本在这里太诱人了
如果不是reinterpret_cast
,那static_cast
呢?
我对我们拥有的所有这些“不该”的工具感到非常困惑。
reinterpret_cast
绝不能用于向下转换 class 层次结构,因为它不进行基指针调整,这在多重继承的情况下会非常困难。
可以(并且应该!)使用 static_cast
如果他们可以通过某种方式确定真实的对象类型与预期的类型相匹配。 static_cast
在不需要基指针调整时仍然是 0 成本,并且在需要时将正常工作(尽管有成本)。
我是一个喜欢深入细节的人。这次我创建了非常简单的功能,我称之为“场景”(查看下面的代码)。首先我会向你介绍 我的看法:
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);
}
};
我得出的结论是,user/developer 绝对不可能得到错误类型的上下文。是不是这里用错了reinterpret_cast
?如果是,为什么?绝对零成本在这里太诱人了
如果不是reinterpret_cast
,那static_cast
呢?
我对我们拥有的所有这些“不该”的工具感到非常困惑。
reinterpret_cast
绝不能用于向下转换 class 层次结构,因为它不进行基指针调整,这在多重继承的情况下会非常困难。
可以(并且应该!)使用 static_cast
如果他们可以通过某种方式确定真实的对象类型与预期的类型相匹配。 static_cast
在不需要基指针调整时仍然是 0 成本,并且在需要时将正常工作(尽管有成本)。