[英]Casting base class pointer to pointer of class member
题:
我们确实有一个基于模板的类,它提供了一些围绕原始类型的功能(例如,序列化,反序列化等)。
template <typename PRIM_TYPE> class WrappedPrimitive
{
public:
PRIM_TYPE v;
//lots of other methods, including serialization and deserialization
PRIM_TYPE & operator= (const PRIM_TYPE & value) { v = value; return v; }
operator PRIM_TYPE() const { return v; }
};
typedef WrappedPrimitive<float> WrappedPrimitiveFloat;
假设我有一个功能
void maninpulateFloat(float *f) {*f = 5.0f;}
有什么方法可以添加一些类函数,以便在从*WrappedPrimitiveFloat
为*float
时返回v
成员的地址。 (或通常从*WrappedPrimitive<PRIM_TYPE>
到*PRIM_TYPE
吗?
WrappedPrimitiveFloat myfloat;
manipulateFloat(&myfloat.v) // This works
manipulateFloat(&myfloat) // Is there any way to make this work?
背景:
我知道这可能不是一个好主意,但是我想要它的原因是因为我们将代码移植到了Linux,其中myfloat实际上是一个float而不是一些包装值。 现在,我们需要通过
#ifdef _WIN32
manipulateFloat(&myfloat.v)
#else
manipulateFloat(&myfloat)
#endif
这也真的很丑。 另外,我对在Windows / Linux上都可以运行的代码感到满意。
我尝试过的
可能会使运算符和功能过载,
PRIM_TYPE * operator& () {return &v;}
但是根据这篇文章, 重载一元运算符&并不是最好的主意,因为使用&总是会返回PRIM_TYPE*
。
您可以实现模板get_address()
函数,并在所需的任何地方使用它,而不是一元&
:
template <typename PRIM_TYPE> class WrappedPrimitive
{
public:
operator PRIM_TYPE() const { return v; }
// these conversions are necessary to implement
operator PRIM_TYPE&() { return v; }
operator const PRIM_TYPE&() const { return v; }
};
template <typename PRIM_TYPE>
PRIM_TYPE* get_address(PRIM_TYPE& v) {
return &v;
}
template <typename PRIM_TYPE>
PRIM_TYPE* get_address(WrappedPrimitive<PRIM_TYPE>& wp) {
return &static_cast<PRIM_TYPE&>(wp);
}
template <typename PRIM_TYPE>
const PRIM_TYPE* get_address(const WrappedPrimitive<PRIM_TYPE>& wp) {
return &static_cast<const PRIM_TYPE&>(wp);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.