2011-10-27 18 views
9

我有一個函數,在某些情況下需要返回NULL,還有另一個函數需要測試這個函數的返回值。我知道boost :: optional,但不知道如何使用語法。如何使用boost ::可選<T>在C++中返回NULL?

下面會說使用一個簡單的例子:

int funct1(const string& key) { 
    // use iterator to look for key in a map 
    if(iterator == map.end()) { 
    return NULL // need help here! 
    else 
    return it->second; 
} 

void funct2(string key) { 
    if(funct1(key) == NULL) { // <-- need help here! 
    // do something 
    } else { 
    // do something else 
    } 

可有人請與語法的幫助嗎?

謝謝。

+9

已經提問10個問題並接受0個答案。你應該回去接受正確的答案。 –

回答

14

在設置之前,它保持在「NULL」狀態。你可以使用這個成語:

optional<int> funct1(const string& key) { 
    // use iterator to look for key in a map 
    optional<int> ret; 
    if (iterator != map.end()) 
    { 
    ret = it->second; 
    } 

    return ret; 
} 

然後:

if (!funct1(key)) { /* no value */ } 
1

試試這個:

int funct1(const string& key) 
{ 
    // use iterator to look for key in a map 
    if(iterator == map.end()) 
    return boost::optional<int>(); 
    else 
    return boost::optional<int>(it->second); 
} 

void funct2(string key) 
{ 
    const boost::optional<int> result = funct1(key); 
    if (result.is_initialized()) 
    { 
    // Value exists (use result.get() to access it) 
    } 
    else 
    { 
    // Value doesn't exist 
    } 
} 

我也會的typedef模板,使事情變得更加簡單:

typedef boost::optional<int> OptionalInt; 
+5

Boost.Optional文檔說'is_initialized'已棄用;改用'bool'轉換運算符(例如'if(result){...}')。另外,你的'funct1'返回類型不應該是'int'。 – ildjarn

3

讓我在進入曲線之前提及一些事情estion。

如果應該總是找到字符串(如果不是,程序員會發生錯誤)如果不能使用可選項,則應該拋出。即使用戶輸入,你甚至可能想要嘗試/抓住/拋出。

如果你的類模仿容器的語義,你應該考慮使用end sentinel來表明它沒有被找到,而不是null。

但是,如果返回空值表示是您所追求的,則函數返回類型爲boost::optional<int>,空返回值爲return boost::none;

+1

嗨馬克B - 爲什麼你建議返回boost :: none而其他人更喜歡只返回可選本身?有區別嗎?如果有,在專業代碼設置中哪個是首選?我的代碼旨在成爲其他用戶可以使用的庫,所以在嚴重依賴用戶輸入的代碼中,try/catch/throw更受歡迎?謝謝。 – czchlong

+0

我也推薦使用'boost :: none',因爲它增加了可讀性(在我看來)。 –

相關問題