【问题标题】:invoking "operator T()" in c++ smart pointer implementation在 C++ 智能指针实现中调用“运算符 T()”
【发布时间】:2020-01-01 22:33:34
【问题描述】:

我正在使用一些包含以下运算符的智能指针实现:

template<class T>
class my_unique_ptr {
public:
    ...

    operator T() {
        return _t;
    }

    T *operator &() {
        return &_t;
    }

private:
    T _t;
};

我希望从由指针类包装的类型 T 中获取原始值。

&amp; 运算符工作正常,但它给出了我的指针而不是值本身。

因此,我希望调用T() 运算符(就像std::unique_ptr 中的get()

我尝试直接使用该变量,但它将其称为my_unique_ptr&lt;T&gt; 而不是T

void func(myClass c);

int main()
{
     my_unique_ptr<myClass> x = new myClass(..);
     func(x); 
}

但我收到无法从类型“my_unique_ptr”转换为指针类型“myClass”的错误

我怎么称呼这个运营商?

【问题讨论】:

  • operator-&gt; 可能是你想要的
  • operator*
  • T* _t; 如果它应该存储一个指针。
  • 您可以像这样调用 () 运算符:x();。代码没有多大意义。 _t 不是指针,运算符 () 按值返回副本。而且由于您没有显示构造函数或赋值,这使它成为一个糟糕的问题,因为我们无法编译它并且无法猜测您编写的内容,因为我们所拥有的内容不连贯。如果您想学习如何编写唯一指针,请查看std::unique_prt 代码。

标签: c++ templates smart-pointers


【解决方案1】:

我怎么称呼这个运营商?

当您在对象上使用&amp; 时,将调用该函数。

 my_unique_ptr<myClass> x = new myClass(..);
 auto ptr = &x;

这里,ptr 将是 myClass* 类型。为了能够使用

 func(x); 

您必须定义一个转换运算符。

operator T&() {
    return _t;
}

【讨论】:

  • 所以operator T() 也是一种转换运算符(效率较低)。但是我该如何称呼这个运营商。也许您可以添加到您的示例代码中?
  • @IradK,当需要从my_unique_ptrT&amp; 的转换时,将隐式调用该函数。要显式调用它,您可以使用x.operator myClass&amp;();
  • 我只是想知道为什么我的例子中出现了转换错误如果我已经有了这个运算符并且根据func签名,它需要myClass而不是my_unique_ptr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多