我的方法可以返回某種指針(例如boost :: shared_ptr),並且此指針可能爲NULL。是否有任何方法來強制我的代碼的用戶檢查,如果它是空的或不是?在C++中強制NULL檢查
這樣的事情的一些例子 - scals的Option容器,可能是boost有boost :: option之類的東西嗎?
我的方法可以返回某種指針(例如boost :: shared_ptr),並且此指針可能爲NULL。是否有任何方法來強制我的代碼的用戶檢查,如果它是空的或不是?在C++中強制NULL檢查
這樣的事情的一些例子 - scals的Option容器,可能是boost有boost :: option之類的東西嗎?
你可以做到以下幾點:
'boost :: optional'如何比指針更好? –
前兩種解決方案並沒有真正解決這個問題。據推測,有些情況下函數應該返回一個空指針;客戶必須進行測試,並在這種情況下采取不同的行爲。可以用異常來做到這一點,但是如果檢查應該立即發生在調用函數中,則會使事情變得特別難以處理。 –
這裏的現實是你的函數的調用者必須檢查。如果他們試圖訪問共享指針而不檢查,那麼如果基礎指針爲NULL,則會發生seg-fault。
您不指定是否在編寫庫或項目中的某些代碼。你也沒有具體說明這個代碼的上下文的細節 - 所有這些都可能決定我在這種情況下采取哪種方法 - 但總的來說,utnapistim的所有建議都是好的。
通常的解決方案是在一個類來包住返回值,這 包含如果指針被選中或 複製,並且其析構函數崩潰,如果沒有設置標誌,該標誌被設置的標誌。 喜歡的東西:
template <typename T>
class MustBeChecked
{
T* myValue;
mutable bool myHasBeenChecked;
public:
MustBeChecked(T* value)
: myValue(value)
, myHasBeenChecked(false)
{
}
MustBeChecked(MustBeChecked const& other)
: myValue(other.myValue)
, myHasBeenChecked(false)
{
other.myHasBeenChecked = true;
}
~MustBeChecked()
{
assert(myHasBeenChecked);
}
bool operator==(nullptr_t) const
{
myHasBeenChecked = true;
return myValue == nullptr;
}
bool operator!=(nullptr_t) const
{
myHasBeenChecked = true;
return myValue != nullptr;
}
operator T*() const
{
assert(myHasBeenChecked);
return myValue;
}
};
坦率地說,我覺得這是矯枉過正在大多數情況下。但我已經看到它在一些關鍵系統上使用了 。
爲什麼你希望用戶在返回你的shared_ptr之前檢查而不是檢查發佈條件? – evpo
你不能強制檢查'NULL'的返回類型。大多數編譯器提供的是未使用函數結果的警告。可能有一個例外更合適? – Deduplicator
「強制我的代碼的用戶檢查」 - 並做什麼如果檢查失敗? –