包装器的 C++ 运算符重载 class
C++ operator overloading for wrapper class
我正在使用一个名为 Pointer 的 class,我猜它是某种围绕真实指针的包装器。我认为 class 中的这行代码使我能够获得真正的指针:
operator const T* () const;
这到底是什么意思?我怎么称呼它?
假设 myPointer
是一个 Pointer<int16_t>
对象。通过使用上面的运算符重载,我应该能够获得包装此指针的 int_16*
对象,但我不知道如何实现。
编辑
根据下面的答案,我现在知道我可以做到这一点:
const int16_t* myRealPointer = myPointer;
现在假设我需要调用一个需要 int16_t*
参数的函数(因此没有常量)。我该怎么做才能将这个 myRealPointer 对象传递给那个函数?
这是一个转换运算符。例如,您可以使用它将 Pointer<T>
转换为 real T*
,此外,还可以在任何需要 T*
的地方使用它:
Pointer<float> p(new float);
const float* p2 = p;
在这种情况下,运算符仅定义为转换为 const 原始指针,因此 float* p2 = p;
不起作用。 (对于这种情况,也可能有类似的运算符。)
这不是你在问题标题中写的operator ()
。它是一个隐式转换运算符,可将 Pointer<T>
类型的 object 转换为 T *
类型的 object。因此,在任何需要 T *
类型的 object 的地方,您都可以使用 Pointer<T>
.
类型的 object
例如
Pointer<int16_t> myPointer;
/* initialization of myPointer */
if ( myPointer != NULL ) std::cout << myPointer << std::endl;
在此代码片段中,运算符被调用了两次:在 if 条件和输出语句中。
如果您不想要这样的隐式转换,您可以使用函数说明符 explicit
声明运算符。例如
explicit operator const T* () const;
如果你真的想写一个像函数调用运算符一样命名的 operator ()
那么它可以看起来像下面的方式
const T * operator ()() const;
在这种情况下,上面的代码片段看起来会有所不同
Pointer<int16_t> myPointer;
/* initialization of myPointer */
if ( myPointer() != NULL ) std::cout << myPointer() << std::endl;
我正在使用一个名为 Pointer 的 class,我猜它是某种围绕真实指针的包装器。我认为 class 中的这行代码使我能够获得真正的指针:
operator const T* () const;
这到底是什么意思?我怎么称呼它?
假设 myPointer
是一个 Pointer<int16_t>
对象。通过使用上面的运算符重载,我应该能够获得包装此指针的 int_16*
对象,但我不知道如何实现。
编辑
根据下面的答案,我现在知道我可以做到这一点:
const int16_t* myRealPointer = myPointer;
现在假设我需要调用一个需要 int16_t*
参数的函数(因此没有常量)。我该怎么做才能将这个 myRealPointer 对象传递给那个函数?
这是一个转换运算符。例如,您可以使用它将 Pointer<T>
转换为 real T*
,此外,还可以在任何需要 T*
的地方使用它:
Pointer<float> p(new float);
const float* p2 = p;
在这种情况下,运算符仅定义为转换为 const 原始指针,因此 float* p2 = p;
不起作用。 (对于这种情况,也可能有类似的运算符。)
这不是你在问题标题中写的operator ()
。它是一个隐式转换运算符,可将 Pointer<T>
类型的 object 转换为 T *
类型的 object。因此,在任何需要 T *
类型的 object 的地方,您都可以使用 Pointer<T>
.
例如
Pointer<int16_t> myPointer;
/* initialization of myPointer */
if ( myPointer != NULL ) std::cout << myPointer << std::endl;
在此代码片段中,运算符被调用了两次:在 if 条件和输出语句中。
如果您不想要这样的隐式转换,您可以使用函数说明符 explicit
声明运算符。例如
explicit operator const T* () const;
如果你真的想写一个像函数调用运算符一样命名的 operator ()
那么它可以看起来像下面的方式
const T * operator ()() const;
在这种情况下,上面的代码片段看起来会有所不同
Pointer<int16_t> myPointer;
/* initialization of myPointer */
if ( myPointer() != NULL ) std::cout << myPointer() << std::endl;