2011-05-03 33 views
2

使用boost::any是非常有用的,但它非常令人沮喪,它沒有getter,並且總是我們必須使用any_cast來將其轉換爲我們想要的類型。但爲什麼它沒有這樣的事情?在我看來,一個波紋管可能是有用的成員。有什麼不好的東西我看不到?爲什麼不提升::任何有「getter」?

template <class T> 
void get(T * handle) 
{ 
    *handle = boost::any_cast<T>(*this); 
} 

編輯:

唯一不好的就是我看到的,這需要吸氣劑有賦值運算符。

+3

和區別是..? – 2011-05-03 16:56:45

+1

爲什麼在任何方面都優於'any_cast'? – 2011-05-03 16:56:57

+0

也許你的意思是「鬱悶」? – 2011-05-03 16:58:47

回答

5

可能因爲它的行爲與any_cast完全相同,但是描述性較差。 any_cast表示您正在執行轉換,類型轉換。你是嘗試以從any對象中獲取值。因此,用戶很清楚,如果您使用錯誤的類型調用該操作,該操作可能會失敗。

A get功能不太清楚故障條件。我通常不會指望簡單地命名爲get的功能能夠失敗。如果是這樣,我不確定它的語義。

如果你想要一個get函數,也許你應該使用boost::variant來代替。

2

any_cast關鍵是要迫使人們使用模板參數推導,因爲還是不投的失敗是用於建設確切類型非常敏感。

這種用法是明確的:

any x(2); // store an int 
double f = any_cast<int>(x); // ok, request for an int, then cast to double 

這個人是不是:

int g; 
... 
x.get(&g); // Ok. For now. 

事實上,現在想象你重構你的代碼,您可以通過

更換

int g; 

double g; 

現在,新的代碼看起來像

double g; 
... // There can be 100s of lines here 
x.get(&g); // This line HAS changed semantics and cast will fail 

這將可能使你失去了一些半小時進行調試。

相關問題