我有一个如下的模板类。
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中指出了类似的问题,但此处未讨论类型别名的使用。
答案 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;
}
施加不必要的限制。