具有模板化参数的部分特化函数模板

Hug*_*ugh 4 c++ templates partial-specialization template-specialization

我有一个模板功能(为简化起见,我们称之为"添加")

template<typename T>
inline T add(const T a, const T b)
{
    return a+b;
}
Run Code Online (Sandbox Code Playgroud)

我可以将它专门用于某些类型,但我想做的是将它专门用于模板类型.

就我而言,我的模板类型被调用Vec2<T>.它是一个二维三角矢量(如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);
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够做到的,这就是我发现自己陷入困境的地方,如:

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);
}
Run Code Online (Sandbox Code Playgroud)

我觉得必须有这样做的方法,但我很难找到合适的语法.

son*_*yao 7

功能模板不允许使用部分模板专用(它仅适用于类模板).您可以使用函数模板重载:

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);
}
Run Code Online (Sandbox Code Playgroud)

当您add使用Vec2as参数的所有实例调用时,它将被选中.


最好将参数更改为pass-by-const-reference以避免复制.