2017-03-13 116 views
0

我有一個函數,現在可以爲我返回一個特定類型的值。它看起來像這樣模板函數編譯時返回類型無參數

template<typename T> 
T getNullValue(){ 
    if(std::is_same<T,long long>::value){ 
     return NULL_LONG; 
    }else if(std::is_same<T,double>::value){ 
     return NULL_DOUBLE; 
    } 

} 

這工作,但我不喜歡它在運行時解決,而不是編譯時間,但這個可以讓我做

double x = getNullValue<double>(); 
long long y = getNullValue<long long>(); 

我怎樣才能讓這個我可以只是重載不同版本的getNullValue,取決於我想返回的內容,而不必在運行時解決它。

getNullValue<type i need>(); 
+0

請注意,如果使用優化進行編譯,此代碼是最優的。您可以執行「優雅」的模板重載,但會使代碼比本應更復雜。 –

+0

簡單的答案是'如果constexpr'並且沒有別的東西需要改變。 – chris

+0

你是說如果我做「如果constexpr(std :: is_same ....)」那麼它在編譯時解析? – flips

回答

1

模板專門化應該很好地做到這一點。一個優化編譯器應該將其轉換爲一個簡單的賦值。

// getNullValue.hpp : 

template <class T> 
T getNullValue() { 
    return 0; 
} 

// remember to declare specialization in header or strange linking errors may occur 
template <> long long getNullValue<long long>() 
template <> double getNullValue<double>() 


// getNullValue.cpp: 

template <> long long getNullValue<long long>() { 
    return NULL_LONG; 
} 
template <> double getNullValue<double>() { 
    return NULL_DOUBLE; 
} 

int main() { 
    double x = getNullValue<double>(); 
    long long y = getNullValue<long long>(); 
} 

查看http://en.cppreference.com/w/cpp/language/template_specialization瞭解更多專業化的例子。

+0

謝謝,這正是我需要的! – flips

相關問題