2013-10-18 38 views
0

的另一種實現最近我觀看了安德烈Alexandrescu的給予presentation about "Systematic Error Handling in C++"。所提出的預期模板的結構如下:預計<T>

template<class T> class Expected { 
    union { 
     T ham; 
     std::exception_ptr spam; 
    }; 
    bool gotHam; 
}; 

使用UNION使實現有點複雜,因爲你需要通過gotHam然後決定如何在工會處理數據分支。即初始化列表上的初始化不能爲hamspam完成。

不知簡化版本會做的更好。

template<class T> class Expected { 
    union { T ham; }; 
    std::exception_ptr spam; 
}; 

在這種情況下,spam可用作發生錯誤時的指示器。

+5

在您的版本的'union'沒有任何意義...... – MFH

+0

我想'union'將防止T'的'默認構造函數的執行。 –

+1

您仍然需要分支,但現在您需要測試垃圾郵件是否爲空指針。沒有區別。 – Simple

回答

1

你可以使用一個指針上火腿,這樣的默認構造函數不叫,你並不需要工會並不真正意義在你的版本。

另外,我不認爲你的版本變化需要分支,因爲你還是要測試異常指針,而不是布爾值。

1

我的意見寫成一個答案:

你的版本有幾個問題:

  • 而不是sizeof(Expected) == max(sizeof(T), sizeof(std::exception_ptr)) + sizeof(bool)你有sizeof(Expected) == sizeof(T) + sizeof(std::exception_ptr)。由於std :: exception_ptr更像是一個智能指針,而不是一個普通的指針,它可能會更大。
  • std :: exception_ptr不保證是constexpr,你總是必須構造它。這意味着Expected不能被縮減,仍然是可移植的。

對於所有的缺點,你仍然必須打開異常指針,它不比bool複雜。