標籤:

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&(); // 0
auto d = Fuck&(); // nullptr


Widget do_something();

既然是「判斷函數是否調用成功」,這種需求下最通用的報錯方法是拋異常。

並不是所有 Widget 都支持特殊狀態,成功返回的函數的值域也不一定與 Widget 的取值範圍不同(比如一個計算整數和的函數,返回類型的取值範圍內都是有效的返回值)。

拿題目里的「返回是個 vector 對象」來說,同事推薦「返回 {} 表示出錯」。

std::vector& get_users();

如果這是一個「獲取資料庫 users 表中的所有用戶」的函數,表中沒有用戶是一個正常情況,所以空 vector 是允許的,並不意味著函數調用出錯。所以應該用異常表示出錯而非空 vector。

std::vector& get_sundays(Month month);

如果這是一個「獲取指定月份中所有星期日」的函數。因為每月必定有一個星期日,所以返回值天然不可能為空,所以可以通過返回空 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 |