带有模板化参数的偏特化函数模板

Partial specialising function template with templated argument

我有一个模板函数(为了简单起见,我们称之为"add")

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

我可以针对某些类型专门化它,但我想做的是针对模板化类型专门化它。

在我的例子中,我的模板类型叫做 Vec2<T>。它是一个二维三角函数向量(如 x 和 y,而不是 c++ 向量!)

我想做的是针对 Vec2<T> 的一般情况专门化我的 add 函数,而不是必须专门针对 Vec2 可能使用的每种类型.

Vec2<T> 来自的库具有 V2d(双精度)、V2f(浮点)和 V2i(整数)的类型定义。

我可以专门针对其中的每一个使用类似的东西:

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

我觉得一定有办法做到这一点,但我正在努力寻找合适的语法。

Partial template specialization is not allowed for function templates (it only works with class templates). You could use 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);
}

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


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

您不能部分特化函数模板。但是你可以为 class 模板做这件事,所以你所有的函数需要做的就是转发到一个:

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