2017-03-21 378 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

我本來不認識拉姆達捕獲,並認爲有一個bug,但已經想通了,我不覺得有什麼。事實上,這看起來像一個更笨重,但比'reinterpret_pointer_cast'更普遍的解決方案。實際上,'reinterpret_pointer_cast'似乎是個不錯的主意。它只能將重新解釋移開一層。如果存在多級指針(例如'*** char'),則指針會崩潰併產生更多語義技巧變得必要的情況。而在這種情況下,lambda捕獲可以更均勻地應用。 – grovkin

回答

6

有一個現成的功能,你在做什麼,reinterpret_pointer_cast

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

與原來的指針結果指針股份所有權。

相比之下,自己的代碼,結束了兩個獨立的所有權組。如果原先的組先死了,你的新指針將會懸空!

可以使用p1.get()並且如果您使用別名構造函數也可以與原始指針共享所有權。這實際上是如何將這些鑄助手實現(見鏈接):

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

這將創建一個共享指針共享所有權p1而是將被賦予作爲第二個構造函數參數的值。

+0

你有'reinterpret_pointer_cast'的實現嗎?我無法在我的編譯器中找到它。 – tcb

+0

答案沒有說:**如果你需要這樣做,可能是錯誤的**。 –

+0

@tcb:只需點擊鏈接。你會發現它是一個C++ 11功能。現在您可以查看它是否是您的編譯器提供的C++ 11功能之一。有些人會告訴你「如果你的編譯器沒有所有的C++ 11功能,你是某種中世紀的克雷廷」,但這些人是錯誤的;我們這些實際使用C++在現實世界中,而不是僅僅愛好者常常戲謔停留在胚胎C++ 11 _if我們lucky_後,讓我有你的背部;) –

相關問題