2012-12-07 169 views
0

我有以下的模板類:類模板參數推斷與構造

template <typename T> 
struct timer 
{ 
    T period; 

    timer(T p) : 
     period(p) 
    {} 
}; 

初始化它,我需要做的事:

timer<double> t(double(0.0)); 

是可以提高timer的類定義,允許此語法:

timer t(double(0.0)); 

並讓編譯器推斷出double類型從構造函數的參數?

+1

檢查出[爲什麼不從構造函數推斷模板參數?](http://stackoverflow.com/questions/984394/why-not-infer-template-parameter-from-constructor)爲同一問題 –

回答

3

不,你不能這樣做。在這些情況下不會出現類型推斷。您可以使用關鍵字auto和函數模板,使事情變得更容易,但:

template<typename T> 
timer<T> make_timer(T value) { 
    return value; 
} 

// let the compiler deduce double 
auto t = make_timer(0.0); 

注意,這個使用auto關鍵字只在C++ 11標準有效。

而且,這種具體情況,你可以typedef一個double定時器:

typedef timer<double> timer_d; 

timer_d t(0.0); 

雖然我仍然與第一種解決方案,如果你能使用C++ 11。

3

不,這是不可能的,扣除只適用於功能。通常的解決方案是編寫一個make_函數返回一個新的實例。這是C++ 11:

template <typename T> 
timer<T> make_timer(T&& p) { 
    return timer<T>(std::forward<T>(p)); 
} 

auto t = make_timer(0.0); 
相關問題