我有一个模板功能(为简化起见,我们称之为“添加”)
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);
}
我觉得必须有这样做的方法,但我很难为它找到合适的语法。
答案 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);
}
};