2011-09-02 48 views
10

簡要說明,正常函數重載將更好地服務於此示例。它只是作爲學習模板編程的一種方式。話雖如此,但與功能模板專業化相比(儘管這可能有其自身的問題),歡迎您評論使用函數超載的好處/差異。匹配模板專業化分辨率的多種類型


請看下面的例子:

template <typename T> 
inline void ToString(T value, char* target, size_t max_size); 

template <> 
inline void ToString<float>(float value, char* target, size_t max_size) 
{ 
    snprintf(target , max_size , "%f" , value); 
} 

template <> 
inline void ToString<double>(double value, char* target, size_t max_size) 
{ 
    snprintf(target , max_size , "%f" , value); 
} 

就只有這麼寫同時匹配floatdouble類型,這些專業化的一種方式?

基本上我設想寫一個模板專用的模板類型,將同時匹配floatdouble(如排序「浮動或雙」類型匹配的),但我不知道這是否是有可能的話用C++。也就是說,我以前看過意想不到的模板魔法,所以我認爲這是一個很好的問題。

+1

如果你想要的東西匹配多個具體類型,那麼這是部分專業化,這是不允許的功能。 –

+0

hi @Kerrek,我對部分專業化的理解是關於專門化模板參數的一個子集。我在這裏只有一個模板參數。我不關注在這裏如何實現部分專業化 – lurscher

+2

部分專業化意味着結果仍然是一個模板,而不是一個類型。考慮例如'template struct X;模板結構X ;'這是部分。 –

回答

5

這裏有一個標準溶液成語:

#include <type_traits> 
#include <cstdio> 


// Helper class 

template <typename T> 
struct Printer 
{ 
    static typename std::enable_if<std::is_floating_point<T>::value, int>::type 
    print(T x, char * out, std::size_t n) 
    { 
    return std::snprintf(out, n, "%f", x); 
    } 
}; 

// Convenience function wrapper 

template <typename T> int print(T x, char * out, std::size_t n) 
{ 
    return Printer<T>::print(x, out, n); 
} 

void f() 
{ 
    char a[10]; 

    Printer<double>::print(1.2, a, 10); // use helper class 
    print(1.4f, a, 10);     // wrapper deduces type for you 
} 

如果你打電話或者建築用非浮型你會得到一個編譯時錯誤。但要小心,這可能會錯誤地用於長雙打,這需要格式說明符%Lf;並且還記得當通過可變參數函數傳遞時浮點數會被提升爲雙精度值。

+0

啊不知道std :: type_traits,謝謝! – lurscher