带有模板化参数的偏特化函数模板
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);
}
};
我有一个模板函数(为了简单起见,我们称之为"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);
}
};