问题标签 [dynamic-cast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
249 浏览

c++ - 如何确定非多态类型的 mixin 模板的类型兼容性

如果我将混合定义为...

...并用 T 声明它是一个非多态类...

..然后有一个基类指针指向它...

...我以后如何确保 nonPolyPtr 指向 Mixin 类型?

上面没有编译,因为基类是非多态的。

我看到 Boost 有一些可能有帮助的特征类,但我希望有一个更简单的解决方案我忽略了。

0 投票
2 回答
2026 浏览

c++ - 可变参数模板和动态演员表

我有一段 C++ 代码如下:

我想做的是以这样的方式实现 cast_all ,它将每个参数动态转换为 B 中的相应类型,然后使用“转换”参数调用给定的函数 fun 。

例如,在:

cast_all 应该扩展为: foo(dynamic_cast(a1), dynamic_cast(a2));

我看过很多关于可变参数模板的文章。但是,几个小时后,我仍然无法弄清楚。

有任何想法吗?

0 投票
5 回答
753 浏览

c++ - 在生产代码中删除 dynamic_casts 是否安全?

dynamic_casts 较慢,但它们比static_casts 更安全(当然,当与对象层次结构一起使用时)。我的问题是,在我在调试代码中确保所有(动态)强制转换都是正确的之后,我有什么理由不将它们更改为static_casts 吗?

我计划使用以下构造来做到这一点。(顺便说一句,你能想出一个更好的名字assert_cast吗?也许debug_cast?)

编辑: Boost 已经为此提供了一些东西:polymorphic_downcast. 感谢 PlasmaHH 指出这一点。

0 投票
4 回答
921 浏览

c++ - 动态强制转换或函数重载?

考虑以下抽象类:

现在假设我正在从这个抽象类创建多个派生类。但是,在与自己的类型进行比较时,每个都使用不同的算法,在与任何其他派生类进行比较时使用通用算法。在以下两个选项之间,哪个是更好、更有效的选项?

选项 A:

选项 B:

我真的很好奇这些选项有什么优点和缺点,因为 C++ 类型转换对我来说是一个相对神秘的话题。此外,哪种解决方案更“标准”,第二种解决方案对性能有影响吗?

可能有第三种解决方案吗?特别是如果有很多派生类,每个派生类都需要针对不同派生类的特殊比较算法?

0 投票
1 回答
638 浏览

c++ - C++ 映射唯一类并从值中提取子类

新的 C++ 程序员在这里。

我有以下地图定义:

Option 是我创建的一个独特的类。我从来没有真正将 Option 类添加到我的地图中。相反,我总是添加一个从 Option 继承的类,例如,我有一个名为 IntOption 的类,它存储一个 int 变量(它所做的一切)。

现在我通过执行以下操作将 IntOption 添加到我的地图中没有问题:

这很好用,因为当我做

它将返回值“add”。

现在我对你们所有好人的问题是我怎样才能从返回值中获取子类变量?我可以做到以下几点

但我做不到

// getter 因为它不在基类中,而是在扩展 Option 的类中。

我该如何解决这个问题?

我考虑过 typedef std::map MapType;

买我不知道如何进行动态转换,也不知道如何将指向类的指针添加到地图中。

0 投票
4 回答
19499 浏览

c++ - 禁用 RTTI 的 dynamic_cast

我很想知道在禁用 RTTI 的情况下编译带有动态转换的代码时会发生什么(-fno-rtti在 GCC 上或/GR-在 Visual Studio 上)。编译器是否“回退”到static_cast? 由于(至少在 VS 上)它只发出警告,编译后的代码会做什么?

更具体地说,如果我在没有 RTTI 的情况下编译一个我确信 dynamic_cast 不会出现错误的代码(即dynamic_cast可以安全地替换为 a的代码static_cast),会发生什么坏事,如下所示:

0 投票
6 回答
9513 浏览

c++ - 当您使用多重继承时,静态转换何时安全?

我发现自己处于一种我知道某物是什么类型的情况下。类型是三个(或更多)继承级别之一。我调用返回的工厂,B*但是 T 是类型的最高级别(如果我的代码知道它是什么)或第二级别。

无论如何,我static_cast在模板中做了一个错误的事情。我的问题是我什么时候可以安全地进行静态投射?有没有这样的时候?我在这种情况下这样做是因为当我不小心将 T 作为古怪的东西(已经发生并且)动态转换忽略(并返回 null)时,我宁愿得到编译错误。但是,当我知道正确的类型时,指针没有调整,导致我的指针不好。我不确定为什么在这种情况下完全允许静态转换。

我什么时候可以安全地使用 static_cast 进行向下投射?有没有什么情况?现在似乎使用 a 总是错误的static_cast(当目的是向下转换时)

好的,我想出了如何重现它。

0 投票
7 回答
4776 浏览

c++ - 动态转换为 void 指针有实际用途吗?

在 C++ 中,T q = dynamic_cast<T>(p);构造执行一个指向p其他指针类型的指针的运行时强制转换,该指针类型T必须出现在动态类型的继承层次结构*p中才能成功。这一切都很好。

但是,也可以执行dynamic_cast<void*>(p),这将简单地返回一个指向“最派生对象”的指针(参见 C++11 中的 5.2.7::7)。我知道这个功能在动态转换的实现中可能是免费的,但它在实践中有用吗?毕竟它的返回类型充其量是void*,那这有什么好处呢?

0 投票
5 回答
437 浏览

c++ - 如何在这里摆脱 dynamic_cast ?

我正在为我的游戏制作一个简单的图形引擎。

这是接口部分:

这是实现部分:

在这里使用 dynamic_cast 有意义吗?有没有办法避免它?

0 投票
1 回答
106 浏览

c++ - 为什么 const 模板化引用类型与 const 引用类型不同?

考虑这个模板:

我会假设类型const_ref_tanother_const_ref_t是等价的。两者都是const T&'。然而他们不是。唉,下面对它们不等价的演示相当详尽。它取决于dynamic_cast<>用于检查另一个类的类型。

抱歉,这太复杂了,但这是我发现问题的情况的简化版本。

那么,问题是这样的。此代码将const int&,foo< int >::const_ref_tfoo< int >::another_const_ref_t视为等效项,考虑到 typedef,这似乎是合理的。然而dynamic_cast<>仅视为foo< int >::another_const_ref_t等同于const int&foo< int >::const_ref_t在另一种 ( ) 情况下,它将返回 null 。

为什么?