4

我有一個模板函數(爲簡化起見,我們把它稱爲「加」)部分專業函數模板

template<typename T> 
inline T add(const T a, const T b) 
{ 
    return a+b; 
} 

我可以專注它對於某些類型的,但我」 D喜歡做的是專門爲模板類型。

在我的情況下,我的模板類型被稱爲Vec2<T>。這是一個2維三角載體(如X & Y,而不是C++矢量!)

我希望做的是專注我add功能的Vec2<T>一般情況下,而不是有專門爲每個鍵入Vec2可能會使用。

Vec2<T>來自的庫有V2d(double),V2f(float)和V2i(int)的typedef。

我可以專門爲每個這些使用類似:

template<> 
inline V2f add<V2f>(const V2f a, const V2f b) 
{ 
    return V2f(a.x + b.x, a.y + b.y); 
} 

不過,我希望能夠做到,而這正是我發現自己被卡住,是這樣的:

template<typename S> 
inline Vec2<S> add<Vec2<S> >(const Vec2<S> a, const Vec2<S> b) 
{ 
    return Vec2<S>(a.x + b.x, a.y + b.y); 
} 

我覺得必須有這樣做的方式,但我努力尋找它的正確語法。

+0

接受的答案可能是你的興趣http://stackoverflow.com/questions/39250545/sfinae-到化妝基礎模板總是對結果的錯誤 – StoryTeller

回答

7

Partial template specialization不允許用於函數模板(它只適用於類模板)。你可以使用function template overloading代替:

template<typename S> 
inline Vec2<S> add(const Vec2<S>& a, const Vec2<S>& b) 
{ 
    return Vec2<S>(a.x + b.x, a.y + b.y); 
} 

當你調用addVec2所有的實例作爲參數它會被選中。


將參數更改爲傳遞const引用以避免複製會更好。

1

您不能部分專門化功能模板。但是你可以爲類模板做到這一點,那麼你所有的功能需要做的就是期待之一:

template<typename> struct add_impl; 

template<typename T> 
T add(const T a, const T b) 
{ 
    return add_impl<T>::do_it(a, b); 
} 

template<typename T> 
struct add_impl { 
    static T do_it(const T a, const T b) { return a + b; } 
}; 

template<typename S> 
struct add_impl<Vec2<S> > { 
    static Vec2<S> do_it(const Vec2<S> a, const Vec2<S> b) { 
    return Vec2<S>(a.x + b.x, a.y + b.y); 
    } 
};