2012-12-31 58 views
0

我有一定數量的採取typedef「d數據類型的引用的功能,如下所示:具有默認參數爲在C++通過引用

typedef std::map<string, string> dict; 

union ret_t{ 
    int i; 
    long l; 
    double d; 
}; 

ret_t func1(char* bytes, dict &d){ 
    //blah blah 
} 
ret_t func2(char* bytes, dict &d){ 
    //blah blah 2 
} 

我也有地圖上的處理程序的功能,採用boost::function所限定如下:

std::map <int, boost::function< ret_t (char*, dict) > > handlers; 

我定義這使得與我使用,我可以簡單地讀取鍵,調handlers[key](bytes, d);,並有我的函數執行> 100處理器功能,僅需要3如果/別人的我不同數據類型(知道d我需要的類型是另一個我不會涉及的問題。這與問題無關)。這按預期工作。

我的問題是,一小部分函數不使用字典,並將在處理程序之外的上下文中有用(例如,準備字節流並將其轉換爲long int的函數) 。爲了調用從上下文這個函數中,我沒有字典預定義的,我要麼必須創建一個從來沒有使用一個無用的字典:

dict d; 
func1(bytes, d); 

或者我必須pverride功能:

//previous definition 

ret_t func1(char* bytes){ 
    //same blah blah as before 
} 

當我嘗試用默認的參數定義,諸如NULL或一個空的字典,我得到一個編譯錯誤:

default argument for 'dict& d' has type 'dict {aka std::map<std::basic_string<char>, std::basic_string<char> >}' 

有沒有辦法做我想做什麼,沒有爲T o完全重寫我的代碼來傳遞指針而不是引用?

+3

如果你希望它是可選的,指針將是一個選項,就像'boost :: optional'一樣,儘管我不確定它如何與引用一起工作,因爲這是指針的用途。如果你不改變'dict',你可以做'const dict&= {}'。 – chris

回答

0

對於那些不需要字典的函數,創建兩個版本。有一個不會將字典作爲參數的字典,而只是在沒有字典的情況下調用另一個字典。使用前者進行所有直接調用,後者用於像其他函數一樣使用字典進行調度。