C ++在模板调用之间进行转换

时间:2012-06-05 08:55:11

标签: c++ templates casting

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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