假设堆上有一个字节缓冲区:
BYTE *Buffer = new BYTE[128] ;
有时我需要一个字节:
BYTE x = Buffer[5] ;
有时我需要一个指向缓冲区一部分的指针,例如映射结构:
MyStruct *Str = (MyStruct*)&Buffer[5] ;
如果我想在课堂上模仿这个:
class MyBuffer
{
public:
MyBuffer() { Buffer = new BYTE[128] ; }
~MyBuffer() { delete[] Buffer ; }
BYTE operator[](int Index) const { return Buffer[Index] ; }
// BYTE *operator[](int Index) const { return &Buffer[Index] ; }
BYTE *Buffer ;
};
情况 1. 可以,但情况 2.
MyBuffer Buffer ;
BYTE x = Buffer[5] ; // Works
MyStruct *Str = (MyStruct*)&Buffer[5] ; // Won't work
我无法实现仅返回类型不同的同一运算符的两个变体。 所以我想知道,我所要求的可能吗?
您可以将返回类型更改为引用类型(特别是左值引用),如下所示。 这是有效的,因为像
f()
这样的函数调用,其中f
通过左值引用返回是左值,我们可以将operator&
应用于lvlue。
//--v------------------------->return by reference
BYTE& operator[](int Index) const { return Buffer[Index] ; }