C++定義一個函數,返回值為一個對象,如何想辦法返回一個邏輯上的空值?
這樣可以用空值來判斷函數是否調用成功,同事告訴我,如果返回是個vector對象的話,可以用return {} 這樣的寫法。
std::optional
推薦std::optional,因為不是所有的類都有邏輯空這個概念,也不是所有的類都有默認構造,並且用邏輯空來表示失敗也是不合適的
如果你用不了optional,還是乖乖把要返回的東西做成指針放進參數,返回值用一個bool來表示成功與否吧
用不了optional的話,用uniueptr而不是shared ptr,當然更不要返回裸指針
考慮一下:
template&
T Fuck()
{
return {};
}
怎麼樣?
auto a = Fuck&
auto b = Fuck&
auto c = Fuck&
auto d = Fuck&
Widget do_something();
既然是「判斷函數是否調用成功」,這種需求下最通用的報錯方法是拋異常。
並不是所有 Widget 都支持特殊狀態,成功返回的函數的值域也不一定與 Widget 的取值範圍不同(比如一個計算整數和的函數,返回類型的取值範圍內都是有效的返回值)。
拿題目里的「返回是個 vector 對象」來說,同事推薦「返回 {} 表示出錯」。std::vector&
如果這是一個「獲取資料庫 users 表中的所有用戶」的函數,表中沒有用戶是一個正常情況,所以空 vector 是允許的,並不意味著函數調用出錯。所以應該用異常表示出錯而非空 vector。
std::vector&
如果這是一個「獲取指定月份中所有星期日」的函數。因為每月必定有一個星期日,所以返回值天然不可能為空,所以可以通過返回空 vector 表示出錯,但不推薦,因為這樣一來你只知道出錯了,卻不知道錯在哪裡。
所以還是要視情況而定。以前自己寫過一個矩陣類,重載了乘法的操作符,但是想到矩陣不是都能相乘,於是就在類里加了個bool成員變數error標記是不是合法的矩陣,參數矩陣不能相乘的時候構造一個error值為false的矩陣返回就行了。
你們都好高大上,傳統做法是函數返回bool,傳出對象在參數列表裡
最直觀的解決方法就是std::optional. 要麼返回一個空值(NONE), 要麼搞點東西上去(SOME something), 這個概念我是在standard ml裡面看到的. 感覺這方面的需求挺多的, 比如:
max(array)
這個需求如果有不是一個空數組, 自然很好辦, 不過如果進去的是一個空的數組, 也返回一個std::nullopt, 這樣就很通暢了.
DummyObject
第一反應是,有點像swift 里的optional,看了其他回答c++新版也有了optional....發現越來越多的相似之處,也許它們以後就兼容了...
可以拋異常表示調用失敗呀。
為什麼要返回對象?返回對象就要複製一次整個對象,我都是返回指針,能判斷空指針,在外邊釋放一下就好了。我的程序很少返回對象。
用boost的optional,可以表示為初始化的值。或者自己用c++11寫一個類似於optional的模板類。至於std:optional…
返回一個pair&
為該類添加空語義。
std::optional
老老實實用指針不好嗎…
推薦閱讀:
※如何使用C++實現一個and函數?
※如何在 C++ 代碼中提示編譯器某個分支的執行概率高?
※C++ 函數如何返回多值?
※程序員有哪些借口可以讓自己寫的代碼里到處都是Bug並且代碼可讀性很低?
※如何在 Visual Studio 上用 C/C++ 寫 Linux 程序?
TAG:C |