2016-04-16 11 views
1

にはstd :: shared_ptrのを変換しますは、暗黙的変換が</p> <pre><code>struct A { int val = 42; operator int() const { return val; } </code></pre> <p>ので、私はこのようにそれを使用することができますintにのは、私が指定したクラスAがあるとしましょうタイプ

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

タイプAの変数が暗黙的にint型に変換されているのと同じようにしたいと思いますスマートなポインタで。 どうすれば実現できますか?

UPDATE

私は多分私は間違った方法を尋ねて申し訳ありません。 本物はもう少し複雑です。 私がのstd :: shared_ptrのを保持するためにQVariantを使用しています。今の 私はそれを行うためのヘルパー関数を持っています、このような何かを

QVariant variant = QVariant() << a_ptr; 

しかし、私は自動的にそれをしたい:私はこれを行うQVariantに自分のポインタを配置する必要がある場合

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

QVariant variant = a_ptr; 
+3

それをしないでください。 '* a_ptr'と書いてください。 –

+0

新しいスマートポインタは、通常のポインタと同様に動作します。通常のポインタには、逆参照などがあります。 –

+1

オペレータの過負荷は、ほとんどの場合悪い工学です。それを避けてください。 –

答えて

0

その非常に簡単には、間接参照演算子を使用します。

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

作るために、[編集]

QVariant variant = a_ptr; 

は仕事、あなたはshared_ptrの参照を受け入れるQVariantのコピーコンストラクタに追加する必要があります。そして、これはあなたがすることができないものです。このような文をコピーし、初期化と呼ばれ、最初のコンパイラはQVariantにa_ptrの変換を行おうとし、それが利用可能であるならば、QVariantのコンストラクタは、変換a_ptrと呼ばれるコピーします。問題は、a_ptrを逆参照しても、ユーザー定義の変換が2回必要であるということです。

あなたはまだここのようなキャストを追加することができます。

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

QVariant内でAのインスタンスを保持できません。それは大きすぎます。そこにポインタを置く必要があります。パラメータとしてQVariantが必要な文があるときはいつでも、QVariantに変換したい(そして、必要に応じてこの変換を指定する、場合によっては複雑になることもある)。 –

+0

私はQVariantがvoid *を保持できるので、事を変えてしまうので、void *にa_ptr.get()をキャストしてQVariantに代入することができますか? – marcinj

0

は、あなたがそれを試みたことがありますか?
std::shared_ptroperator*を持ち、もう1つは期待できるとして、それは動作します。それを使用しています。

#include <memory> 

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

int main() { 
    auto ptr = std::make_shared<A>(); 
    int v = *ptr; 
} 
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; 
}; 
関連する問題

 関連する問題