![](/img/trans.png)
[英]What is correct way to use string as an argument and parameter or return type in 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%肯定它會成功) 它可能看起來有點冗長,但恕我直言:
std::optional<>
和默認值的處理方式相同 std::terminate()
,嗯,你知道會發生什么 if
/ catch
等。 我看到的唯一問題是構造函數初始化列表。 有什么想法嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.