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

时间:2016-11-14 09:59:37

标签: c++ templates template-specialization partial-specialization

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

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

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

就我而言,我的模板类型称为Vec2<T>。它是一个二维三角矢量(如x&amp; y,而不是c ++矢量!)

我想要做的是将add函数专门用于Vec2<T>的通用案例,而不是专门针对Vec2可能使用的每种类型。< / p>

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);
}

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

2 个答案:

答案 0 :(得分: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);
}

当您使用add的所有实例化作为参数调用Vec2时,将选择它。

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

答案 1 :(得分: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);
  }
};