假设我有一个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;
答案 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_ptr
有operator*
,它可以正常运行:使用它。
#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;
};