2015-11-22 42 views
0

我有一個函數從文件中讀取各種類型的參數,我希望能夠提供默認參數。使用一個簡單的默認函數參數並不是一個好的解決方案,因爲不可能在函數中區分參數是否被指定或者是否使用了默認值。所以我想我會用boost::optional。我有一個類似使用boost ::可選參數作爲模板函數中的參數

template <typename T> 
void func(T& out, boost::optional<T> def_val) { 
// do stuff 
} 

的功能,但是在扣除類型時會失敗,

double x; 
func(x, 3.0); // error: could not match optional against double 
func(x, boost::optional<double>(3.0)); // ok but way too verbose 
func<double>(x,3.0); // ok and better but still not ideal 

這讓我吃驚,我認爲第一out參數就足以讓編譯器推斷T = double和正確解析第二個參數。有什麼辦法可以很好地做到這一點?

回答

0

模板具有類型扣減的精確匹配。在你的例子中,intdoubleT的兩種可能性,所以編譯器會給你一個錯誤。在該語言的其他部分,編譯器將嘗試找到一個通用類型(對於intdouble,這是double),但不適用於模板類型推導。

您可以防止第二個參數從參與類型推演與一個簡單的包裝,它一般是不可能的編譯器,以從中推斷類型:

template<typename T> 
struct id {typedef T type;}; 

template <typename T> 
void func(T& out, boost::optional<typename id<T>::type> def_val) { 
// do stuff 
} 

你可以看到這個編譯並推斷doubleThere。請注意,它不鏈接,因爲我刪除了func的定義,以便該示例顯示推導的類型。