4

我有一个模板函数(为简化起见,我们把它称为“加”)部分专业函数模板

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

我可以专注它对于某些类型的,但我” D喜欢做的是专门为模板类型。

在我的情况下,我的模板类型被称为Vec2<T>。这是一个2维三角载体(如X & Y,而不是C++矢量!)

我希望做的是专注我add功能的Vec2<T>一般情况下,而不是有专门为每个键入Vec2可能会使用。

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

接受的答案可能是你的兴趣http://stackoverflow.com/questions/39250545/sfinae-到化妆基础模板总是对结果的错误 – StoryTeller

回答

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

当你调用addVec2所有的实例作为参数它会被选中。


将参数更改为传递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); 
    } 
};