【问题标题】:Using reinterpret_cast to check inheritance at compile time在编译时使用 reinterpret_cast 检查继承
【发布时间】:2014-12-26 07:35:42
【问题描述】:

关于这个问题:When to use reinterpret_cast?

我发现了某事。像这样:

template<typename T> bool addModuleFactoryToViewingFactory(ViewingPackage::ViewingFactory* pViewingFactory)
{
 static_cast<ModuleFactory*>(reinterpret_cast<T*>(0)); // Inheritance compile time check

  ...
}

这是在编译时检查 T 是否可以转换为 ModuleFactory 的好方法吗?
我的意思是,检查程序员是否将有效的东西放入&lt;&gt;of addModuleFactoryToViewingFactory&lt;T&gt;(...)
这是好的、好的还是唯一的方法?

问候

【问题讨论】:

  • 是的。它没有错……但这是一个好方法还是唯一的方法?
  • 这可能不太好,记住 static_cast 双向有效,reinterpret_cast 在这里完全没有根据(你需要另一个 static_cast 代替)。

标签: c++ casting reinterpret-cast


【解决方案1】:

您正在尝试解决一个不需要解决的问题。从 C++11 开始,我们有了类型特征,允许我们在模板元编程中明确地检查这样的事情。

例如,is_base_of

http://en.cppreference.com/w/cpp/types/is_base_of

【讨论】:

  • 此问题标记为 c++11。
  • 也许C++11可以做的更好,但是如果不允许我使用C++11的新特性呢?
  • 如果他仅限于 C++03,总有 BOOST。
  • 我实际上可以保证 Boost 实现会起作用,如果这就是你的意思的话。如果您的示例具有非公共继承或模棱两可的基类,您发布的代码会如何表现?
  • 我不明白你的意思。基类是 ModuleFactory。我读了这样的代码:cast sth。如果 T* 位于 ModuleFactory 的继承“树”中的某个位置,则转到 T* 以使用 static_cast 检查。如果基类ModuleFactory是……。否则代码将检查 T* 是否是 'sth.别的' ?!如果有人会写某事,也许它会更好地阅读。像这样:T* p; static_cast&lt;ModuleFactory&gt;(p)。我认为这应该是没有reinterpret_cast
猜你喜欢
  • 2017-12-16
  • 2020-08-09
  • 2014-06-17
  • 2020-02-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
相关资源
最近更新 更多