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

4

我有一个模板函数(为简化起见,我们称之为“add”)

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

我可以为特定类型进行专门化,但我想专门化模板类型。在我的情况下,我的模板类型称为Vec2 。它是一个二维三角向量(以x和y为例,而不是c ++向量!)我想要做的是为通用情况下的Vec2 专门化我的add函数,而不必为每种可能使用Vec2的类型进行专门化。Vec2 来自的库具有double的typedefs V2d,float的typedefs V2f和int的typedefs 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);
}

我觉得一定有方法可以做到这一点,但我找不到正确的语法。

接受的答案可能会对您有所帮助 https://dev59.com/mJrga4cB1Zd3GeqPllsF - StoryTeller - Unslander Monica
2个回答

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

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


最好将参数更改为通过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);
  }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接