带有模板化参数的部分特化函数模板
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++的vector!)
我想做的是将add
函数专门用于Vec2<T>
的一般情况,而不是必须专门用于Vec2
可能使用的每种类型。
Vec2<T>
来自的库有V2d
(double)、V2f
(float)和V2i
(int)的类型定义。
我可以使用如下代码来专门处理这些:
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);
}
我觉得一定有一种方法可以做到这一点,但我正在努力寻找正确的语法。
函数模板不允许部分模板特化(它只适用于类模板)。你可以使用函数模板重载:
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,以避免复制。
不能部分特化函数模板。但是你可以为类模板这样做,所以所有你的函数需要做的就是转发到一个:
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);
}
};
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 是否可以获取成员函数模板参数的拥有对象?
- 如何防止用户指定函数模板参数,迫使其进行推导
- 使用用户定义的转换运算符推导函数模板参数
- 构造函数模板参数推导,其中 std::function 作为参数
- 在简单地移动参数时使用函数模板参数的优点
- 使用函数模板参数作为类模板参数?
- 函数模板参数推断使用 std::Optional 失败
- 函数模板参数包问题
- 尝试将 C++11 代码转换为 C++03 时默认函数模板参数出错
- 是否可以从指向成员函数模板参数的指针推断类类型
- 精神语法不会编译:函数模板参数错误?
- 从函数模板参数中自动推论对容器的元素类型
- 函数模板参数推导和继承
- 有人能解释一下特殊的std::函数模板参数列表语法(这个奇怪的类型(Types..))吗
- 成员函数模板参数的部分专业化
- std::函数模板参数解析
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 具有指针数据类型的非类型函数模板参数
- 从模板参数类型中推导函数模板参数