2014-02-16 38 views
0

此問題是this one之後的後續操作。實際問題是,如this list所示,Visual Studio 2012不支持功能模板的默認模板參數Visual Studios 2012中的默認模板參數


由於默認模板參數不被視覺工作室2012的支持,有沒有什麼解決辦法有沒有它同樣的結果?那麼是否可以定義模板函數,如

template <typename T, typename Ret = T> 
Ret round(T val, Ret ret = Ret()) { 
    return static_cast<Ret>(
     (val >= 0) ? 
     floor(val + (T)(.5)) : 
     ceil(val - (T)(.5)) 
    ); 
} 

不使用默認模板參數?該功能可以作爲

auto a = round(5.5, int()); // int a = 6 
auto b = round(5.5); // double b = 6.0 
+1

您可以隨時添加一個過載,例如'模板 T輪(T val);' – dyp

+0

@dyp:已更正。謝謝。過載確實有效。我之前在鏈接問題中的例子讓我感到困惑。這不是一個聰明的問題...... – Didii

+0

難道你不希望四捨五入默認爲你分配的任何類型而不是輸入類型嗎? – Yakk

回答

1

與此類似,也傳遞一個值來強制返回類型是不是真的一個很好的辦法做到這一點,使用模板參數來代替:

#include <iostream> 
#include <cmath> 

template <typename Ret, typename T> 
Ret round(T val) { 
    return static_cast<Ret>(
     (val >= 0) ? 
     std::floor(val + (T) (.5)) : 
     std::ceil(val - (T) (.5)) 
     ); 
} 

template <typename T> 
T round(T val) { 
    return round<T,T>(val); 
} 

auto a = round<int>(5.5); // int a = 6 
auto b = round(5.5); // double b = 6.0 

static_assert(std::is_same<decltype(a), int>::value, "a must be int"); 
static_assert(std::is_same<decltype(b), double>::value, "b must be double"); 

int main() { 
    std::cout << a << " " << b; 
} 
+0

謝謝!這是我的兩個問題的答案。我插入了'round (val)'作爲導致編譯器錯誤的重載函數的返回值。我將這個答案與前面的問題聯繫起來。 – Didii

+2

好奇,'圓(5)'哪些電話? – Yakk

+0

一個模糊的調用......因爲這是一個解決方法,以一個缺少的功能和調用一輪整數輸入可能會是一個錯誤,我會使用'模板自動輪(T val) - > typename std :: enable_if :: value,T> :: type;'而是在2參數版本中使用static_assert來強制T成爲浮點值。 – galop1n