簡體   English   中英

在不使用指針的情況下,在C ++中返回“無效值”類型的正確方法是什么?

[英]What is the correct way to return an 'Invalid Value' type in C++, without the use of pointers?

當從函數返回時,我經常使用-1作為無效值類型,其中輸入產生不正確的輸出。 例如,編寫索引超出范圍的索引函數,而不是拋出異常,可以返回-1 但是當編寫具有負值的函數作為可能的返回類型時,此技術不起作用。 在這種情況下返回無效類型值的正確方法是什么?

我主要使用的技術是將返回類型設置為*int類型,並將指針返回NULL 但是,這要求所有返回值都是指針類型,這似乎是函數的額外開銷。 在這種情況下,是否有可接受的返回值標准?

在較新的C ++中,我建議使用std::optional<> ; 如果你還沒有它, boost::optional<>

一個選項是讓你的函數采用bool&作為輸出參數,用於指示返回的值是否有效。

int myFunc(bool& valid); // sets 'valid' to true if result is usable, false otherwise

然后用戶可以這樣做

bool valid = false;
Int result = myFunc(valid);
if (!valid) {
    // Handle error
}
// Use result

不是最漂亮的解決方案,但它完成了這項工作。

除了我上面提供的答案,還有一個非常干凈,持續傳遞的解決方案(鑒於你是非虛擬的):

template<typename Success, typename Failed>
void parse( const std::string& str, Success s, Failed f )
{
    auto a = start_parse(str);
    if( a.problem() )
        return f(); // you _might_ have an error code here

    s( finish_parse(str, a) );        
}

然后您可以通過以下方式進

  • 成功:
    • [&i] (int i_) { i = i_; }
    • out(i)其中, out(int& output_)返回上述的λ output_
    • 做有用的實際代碼
    • 功能繼續
  • 失敗:
    • [&i]{ i = 0; } [&i]{ i = 0; } ,`[&i] {i = nullopt; },或任何其他默認值
    • [] { throw MyFavouriteException(); }
    • 重試邏輯
    • std::terminate()
    • []{}如果你不在乎(或者如果你100%肯定它會成功)

可能看起來有點冗長,但恕我直言:

  • 閱讀是微不足道的
  • 即使沒有默認的c'tor,也可以模仿任何其他原理圖
    • 也很容易改變
  • “你不為你不使用的東西買單”,肯定可以優化掉
  • 從代碼中可以看到每個原理圖:
    • 對於默認值,調用者設置它,而不是被調用者或全局
    • std::optional<>和默認值的處理方式相同
    • 例外,調用者更清楚知道要扔什么
    • 如果不采取任何措施,您不必查找實現就知道這一點
    • 對於std::terminate() ,嗯,你知道會發生什么
    • 如果你說“CPS”,你可能會繼續並保存if / catch等。

我看到的唯一問題是構造函數初始化列表。 有什么想法嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM