2014-03-25 45 views
1

爲什麼使用boost :: optional作爲scoped_ptr不是常見的地方,它似乎更好,因爲對象是在堆棧而不是堆上創建的。但我從來沒有見過這種方式。我的問題是,使用boost :: optional作爲一種scoped_ptr而不是明顯無法做多態的缺點是什麼?爲什麼不使用boost ::可選作爲更好的scoped_ptr

+2

剛纔聲明你想要的變量有什麼問題,爲什麼把它包裝在boost :: optional中呢? –

+0

我有同樣的想法。從性能角度來看,boost :: optional會擊敗scoped_ptr。只有嚴重的缺點是語義(或'milleniumbug'指出缺少多態性) – gast128

回答

2

首先,我會說語義。

我需要刷新boost::optionalboost::scoped_ptr細節我記憶給在技術方面的意見,但是當涉及到可維護性,代替指針使用optional s是綁定混淆誰看了你的代碼的人。

+0

如果boost/std會定義像value_ptr與boost :: optional具有相同的實現。 – gast128

2

原因是多態性scoped_ptr。否則,你只需要在棧上聲明變量。

int main() 
{ 
    Class object(52, 25); //sample declaration, with constructor arguments passed 
} 

編輯1(從意見的迴應附加信息):

boost::scoped_ptr實際上很少用於你描述(主要是因爲你不能複製,也不動boost::scoped_ptr的目的,讓你存儲它的類在不可複製和不可移動的情況下)。看起來boost::optional適用於此目的,但是...

請注意,在本地使用boost::optional(即,不從函數返回)時沒有什麼意義,因爲您可以根據意願在堆棧上創建對象:

void another_function() 
{ 
    if(some_condition()) 
    { 
     Class object(0, 0); // create the object 
     // use the object 
    } 
    else 
    { 
     // don't use the object 
    } 
} 
+0

還有一個目的是讓一個成員可以獨立於它所屬的類創建和銷燬。也許一個懶惰的初始化對象? – dan

+0

@dan我更新了我的答案。 – milleniumbug

相關問題