【问题标题】:C++ Casting between template invocations模板调用之间的 C++ 强制转换
【发布时间】:2012-08-13 08:52:03
【问题描述】:

假设X<T>是一个以类为参数的模板类,ABBA派生的类,不涉及多重继承或虚拟继承(即不需要调整指针时)在AB 之间转换)。

X<A*>X<B*> 执行电锯重新解释转换是否安全,反之亦然?当然,X<A*> 不是X<B*>,但是这些类不应该总是共享相同的行为吗?因为使用了指针,所以内存布局应该是相等的。因此,让X<B*> 的方法在实际上是X<A*> 的实例上运行可能没问题。

当然,这会以某种方式破坏类型安全,例如我可以将A* 的元素插入X<B*>,但这超出了本问题的范围。

【问题讨论】:

  • 一般来说,没有。 reinterpret_cast 不是很有用。
  • 为什么?代码会在哪里中断?
  • 只需要写一个模板化的转换操作符。
  • @gexicide 某处。我还没有看到任何代码。
  • 那么代码应该类似于 X b = reinterpret_cast>(new X());

标签: c++ templates casting


【解决方案1】:

如果你真的需要,最好写这样的东西。

X<A*> a(new B());
X<B*> b( dynamic_cast<B*> ( a.get_pointer() ) );
if(b.get_pointer() != NULL)
{
    ...
}

【讨论】:

  • 但是如果该类维护大量 A*s 会怎样。我不能只得到一个指针,我必须复制所有内容。
  • 然后我会重复 R. Martinho Fernanes 和 Pubby。不要这样做。这是非常肮脏的 hack(例如 goto)。
  • 我认为我的问题提出的不好,因为我忽略了它背后的意图。我不想写这样的代码,我只想生成它,所以生成代码中的脏黑客是可以的,只要它们的行为是好的。我已经用更好的解释重新发布了这个问题,你可以在这里找到它stackoverflow.com/questions/10912786/…
  • 不像goto。虽然我非常不喜欢 goto,因为它对代码结构造成严重破坏(而且我从不使用它),但使用它是完全安全的。另一方面,reinterpret_castnot 安全的,因为 C++ 标准对这种行为提供了no 保证。它是否有效纯属偶然。
  • 查看 boost::any 的侧面。这会好很多。在 Java 中,您还可以对 Object 类型中的变量进行装箱和拆箱。而这也需要铸造运营商。
【解决方案2】:

不,你不能。如果 B 属于多态类,则将 B* 转换为 A* 可能会更改指针的值。一般来说,使用 reinterpret_cast 从来都不是安全的,如果你仍然需要它,那么你可能写错了(在某些情况下,你需要它,但这不是其中之一)。

顺便说一句,模板可以专门用于模板参数,因此 X 和 X 甚至可能没有相同的内部结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多