如何在编写模板模板函数时使用类型别名

时间:2019-06-09 04:41:31

标签: c++

我有一个如下的模板类。

template <class T>
class Point
{
    T x;
    T y;
    using value_type = T;
    Point() {}
    Point(T a, T b)
    {
        x = a;
        y = b;
    }
};

我想编写一个将x和y值相加并以类定义的类型返回x + y的函数。一种方法是使用模板模板,如下所示:

template <typename T2, template <typename> class T1>
T2 sum(T1<T2> p)
{
    return p.x + p.y;
}

我想知道是否可以使用在类中定义的类型别名,而避免为sum函数编写模板模板并获得相似的结果? here中指出了类似的问题,但此处未讨论类型别名的使用。

3 个答案:

答案 0 :(得分:3)

您肯定可以。

template <typename T>
typename T::value_type sum(T p)
{
    return p.x + p.y;
}

答案 1 :(得分:2)

一种可能是执行以下操作:

template <class T>
T sum(Point<T> p) {
  return p.x + p.y;
}

答案 2 :(得分:1)

您可以这样做,以避免让sum()接受过于广泛的类型集:

template <typename T>
typename Point<T>::value_type sum(const Point<T>& p)
{
    return p.x + p.y;
}

如果const&复制较大或昂贵,则为T,并且由于typename是从属名称(取决于作为{{ 1}}),因此如果没有这样的话,代码将无法编译,因为value_type可能是值而不是类型。

更通用的替代方法是允许类型为T不产生value_type的类型T

operator+

这不能严格回答您有关如何使用类型别名T的问题,但是它可能是更好的代码,因为它不会对template <typename T> auto sum(const Point<T>& p) { return p.x + p.y; } 施加不必要的限制。