在汇编时间期间,一个点子(无论是衍生的还是基的)上台/下台不会改变点值。 这就是说,该插文相当于<代码>reinterpret_cast。
具体设想如下: 我有一个<代码>Base 类别和Derived
(明显取自Base
)。 还有一个模板:<代码>Wrapper类别,由指定为模板参数的那类点人组成。
class Base
{
// ...
};
class Derived
:public Base
{
// ...
};
template <class T>
class Wrapper
{
T* m_pObj;
// ...
};
在某些情形下,我有不同的类型:<代码>Wrapper<Derived>,而我也希望称一种功能,即获得(最先进的)参考资料-ro <代码>Wrapper<Base>。 显然,这里没有自动投放,Wrapper<Derived>
不是来自Wrapper<Base>
。
void SomeFunc(const Wrapper<Base>&);
Wrapper<Derived> myWrapper;
// ...
SomeFunc(myWrapper); // compilation error here
在标准C++范围内有处理这种情况的办法。 与此类似:
Derived* pDerived = myWrapper.Detach();
Wrapper<Base> myBaseWrapper;
myBaseWrapper.Attach(pDerived);
SomeFunc(myBaseWrapper);
myBaseWrapper.Detach();
myWrapper.Attach(pDerived);
但我不喜欢这样做。 这不仅需要一个宽松的子,而且还会产生额外的代码,因为Wrapper
有一个非游子(如你可能猜测),而Im则使用例外处理。 OTOH 如果Base
和Derived
相同(例如,由于没有多重继承),只能将myWrapper
投到所需的类型和SomeFunc
,并且将发挥作用!
因此,在<代码>Wrapper上添加如下内容:
template <class T>
class Wrapper
{
T* m_pObj;
// ...
typedef T WrappedType;
template <class TT>
TT& DownCast()
{
const TT::WrappedType* p = m_pObj; // Ensures GuardType indeed inherits from TT::WrappedType
// The following will crash/fail if the cast between the types is not equivalent to reinterpret_cast
ASSERT(PBYTE((WrappedType*)(1)) == PBYTE((TT::WrappedType*)(WrappedType*)(1)));
return (TT&) *this; // brute-force case
}
template <class TT> operator const Wrapper<TT>& () const
{
return DownCast<Wrapper<TT> >();
}
};
Wrapper<Derived> myWrapper;
// ...
// Now the following compiles and works:
SomeFunc(myWrapper);
问题在于,在某些情况下,军force不成立。 例如:
class Base
{
// ...
};
class Derived
:public AnotherBase
,public Base
{
// ...
};
在此,点人对<代码>Base的价值与<代码>的出入。 因此,Wrapper<Derived>
并不等于Wrapper<Base>
。
我愿发现和防止这种无效播种的企图。 我添加了核查(如你可能看到的那样),但它在run-time进行。 也就是说,该法典将汇编和操作,在运行期间,在 de楼发生坠毁(或失败的断言)。
这是罚款,但是,我很想在汇编时间时赶上这笔钱,而没有建筑。 统计局。
是否有办法实现这一目标?