【问题标题】:Partial specialising function template with templated argument带有模板化参数的部分特化函数模板
【发布时间】:2016-11-14 09:59:37
【问题描述】:

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

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

我可以将它专门用于某些类型,但我想做的是专门用于模板类型。

就我而言,我的模板类型称为Vec2&lt;T&gt;。它是一个二维三角向量(如 x & y,而不是 c++ 向量!)

我想做的是将我的add 函数专门用于Vec2&lt;T&gt; 的一般情况,而不是专门针对Vec2 可能使用的每种类型。

Vec2&lt;T&gt; 来自的库具有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);
}

我觉得必须有一种方法可以做到这一点,但我正在努力寻找合适的语法。

【问题讨论】:

标签: c++ templates template-specialization partial-specialization


【解决方案1】:

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以避免复制。

【讨论】:

    【解决方案2】:

    您不能部分专门化函数模板。但是你可以为类模板做,所以你的函数需要做的就是转发一个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多