2017-03-21 29 views
4

shared_ptr<char>shared_ptr<unsigned char>に変換する良い方法はありますか?std :: shared_ptr <char>をstd :: shared_ptr <unsigned char>に変換する

私は以下を思いついたが、きれいに見えなかった。

int main(int argc, char** argv) 
{ 
    std::shared_ptr<char> p1 = std::make_shared<char>(); 

    std::shared_ptr<unsigned char> p2 = std::shared_ptr<unsigned char>(
     reinterpret_cast<unsigned char*>(p1.get()), 
     [p1](unsigned char*) {}); 
} 
+0

私はもともとラムダ捕獲を理解しておらず、バグがあると思っていましたが、それを考えていたとは思いません。実際、これはもっと厄介なようですが、 'reinterpret_pointer_cast'よりも普遍的な解決策です。実際、 'reinterpret_pointer_cast'は悪い考えです。あるレベルの再解釈だけが削除されます。複数レベルのポインタ(例えば、 '*** char')がある場合、それは分解され、より多くの意味論的トリックが必要になる状況を作ります。このようなシナリオでは、ラムダキャプチャをより均一に適用することができます。 – grovkin

答えて

6

reinterpret_pointer_cast、何をやっているため、既製の機能があります:

std::shared_ptr<unsigned char> p2 = 
    std::reinterpret_pointer_cast<unsigned char>(p1); 

元のポインタを有する得られたポインタの株の所有権。

これとは対照的に、あなたのコードは2つの別々の所有グループで終わっています。元のグループが最初に死んだ場合、新しいポインタはぶら下がったままになります!

p1.get()を使用し、エイリアシングコンストラクタを使用する場合は、元のポインタと所有権を共有します。それは、(リンクを参照)、これらのキャストヘルパーが実装されている方法を実際にあります:

std::shared_ptr<unsigned char> p2(p1, reinterpret_cast<unsigned char*>(p1.get())); 

これはp1と所有権を共有するが、第2のコンストラクタの引数として与えられた値を格納する共有ポインタを作成します。

+0

'reinterpret_pointer_cast'の実装がありますか?私はコンパイラでこれを見つけることができませんでした。 – tcb

+0

答えが言いません:**これを行う必要がある場合は、何かが間違っている可能性があります**。 –

+0

@tcb:リンクをクリックするだけです。 C++ 11の機能であることがわかります。これで、コンパイラが提供するC++ 11の機能の1つであるかどうかを調べることができます。 "あなたのコンパイラがC++ 11のすべての機能を持っていない場合は、中世のクレチンのようなものですが、それらの人は間違っています。実際にC++を実際に使用しているのは、趣味の狂気の晩餐とは対照的に、しばしば胚のC++ 11に執着したからです。私たちは幸運なので、あなたの背中を持っています;) –

関連する問題