繁体   English   中英

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

[英]implicitly convert std::shared_ptr to a type

假设我有一个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一样,我想用智能指针做同样的事情。 我怎样才能做到这一点?

UPDATE

对不起,也许我问错了。 真正的交易有点复杂。 我使用QVariant来保存std :: shared_ptr。 现在我有一个辅助函数来做到这一点:

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

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

QVariant variant = QVariant() << a_ptr;

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

QVariant variant = a_ptr;

它很简单,使用dereference运算符:

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);

你试过吗?
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;
}

就像类型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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM