隐式将std :: shared_ptr转换为类型

时间:2016-04-16 17:40:09

标签: c++ qt shared-ptr implicit-conversion

假设我有一个A类,它指定转换为int

struct A {
  int val = 42;
  operator int() const {
    return val;
}

所以我可以像这样使用它:

A a;
int a_int = a;

但是如果我想使用该类的共享指针该怎么办:

auto a_ptr = std::shared_ptr<A>(new A);
int a_int = a_ptr; // ???

就像类型A的变量被隐式转换为int一样,我想用智能指针做同样的事情。 我怎样才能做到这一点?

更新

对不起,也许我问错了方法。 真正的交易有点复杂。 我使用QVariant来保存std :: shared_ptr。 现在我有一个帮手功能:

QVariant & operator<< (QVariant& v, const std::shared_ptr<A> & aPtr);

当我需要将指针放到QVariant时,我这样做:

QVariant variant = QVariant() << a_ptr;

但我想自动完成,如下所示:

QVariant variant = a_ptr;

3 个答案:

答案 0 :(得分:0)

非常简单,使用解除引用运算符:

int a_int = *a_ptr; // ???
            ^ ~~~

[编辑]

制作:

 QVariant variant = a_ptr;

工作,您必须添加到QVariant复制构造函数,接受对shared_ptr的引用。这是你不能做的事情。这种语句称为复制初始化,第一个编译器尝试将a_ptr转换为QVariant,如果可用,则使用转换后的a_ptr调用QVariant的复制构造函数。问题是即使您取消引用a_ptr,也需要两个用户定义的转换。

您仍然可以像这样添加演员:

 QVariant variant = static_cast<int>(*a_ptr);

答案 1 :(得分:0)

你试过吗? std::shared_ptroperator*,它可以正常运行:使用它。

#include <memory>

struct A {
    int val = 42;
    operator int() const {
        return val;
    }
};

int main() {
    auto ptr = std::make_shared<A>();
    int v = *ptr;
}

答案 2 :(得分:0)

  

就像类型A的变量被隐式转换为int一样,我想用智能指针做同样的事情。

不,你认为你这样做,但你真的没有。

  

我怎样才能做到这一点?

你不能,这是件好事。

  

(期待)任何方式?

将共享指针包装到一个对象中,如下所示:

#include <memory>

template<class T>
struct shared_reference
{
  shared_reference(std::shared_ptr<T> pt) : _pt(std::move(pt)) {}

  operator T& () { 
    return *_pt;
  }

  operator const T& () const { 
    return *_pt;
  }

  std::shared_ptr<T> _pt;
};