我一直在努力理解这段代码
template <typename T, typename _Prd = equal_to<T> >
struct Vector3
{
protected:
T i,j,k;
_Prd comp;
public:
//default constructor
Vector3(void);
//explicit constructor
Vector3(const T& ijk);
//explicit constructor
Vector3(const T& i,const T& j,const T& k);
//copy constructor
Vector3(const Vector3<T,_Prd>& copy_from);
//getters
T I() const;
T J() const;
T K() const;
//setters
void I(const T& i);
void J(const T& j);
void K(const T& k);
//get magnitude of vector.
T Magnitude() const;
//angle between I,J (clockwise)
T Direction() const;
//angle between K and I,J
T Elevation() const;
//scale vector to 1
Vector3<T,_Prd>& Normalize();
//vector scale up-to value
Vector3<T,_Prd>& Scale(const T& length);
...
};
我无法理解第一句话
template <typename T, typename _Prd = equal_to<T> > struct Vector3 {};
关于equal_to<T>
的使用情况,我找到了来自here和here的引用。但仍然没有这样的事情。感谢您帮助我理解这一部分。
更新
在看到答案并阅读一些教科书后,我的问题转向了两个方面。
1。默认模板参数
在C ++ 11中,我们可以为模板提供默认模板参数。 C ++引物第5版的例子。第670页。
#include <functional>
template <typename T, typename F = less<T> >
int compare (const T &v1, const T &v2, F f = F() )
{
if (f(v1, v2) return -1 ;
if (f(v2, v1) return 1 ;
return 0 ;
}
然后我们将此模板用作:
bool i = compare(0,42) ;
模板将使用默认的less函数对象类来实例化。 但是,当我们使用自己的对象时:
Sales_data item(cin), item2(cin) ;
bool j = compare (item, item2, compareIsbn) ;
然后F转而使用compareIsbn function-object。 因此,在我上面的问题中也会发生同样的情况,这种方式会让模板用户有一个入口,允许他们引入自己的函数对象,在这种情况下,它被用作比较器。
2。谓词
答案 0 :(得分:2)
std::equal_to
是一个类模板,提供如下内容:
bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; }
换句话说,它是一个包装普通==
比较器的函数对象类。关键是equal_to
可以是专用的,因此提供了一种添加可定制性的非侵入式方法。
最重要的是,您的模板Vector3
还提供了一种侵入式方式,通过第二个模板参数自定义比较器。
请注意,谓词通常是对象,而不仅仅是特征类。因此,您的容器实际上将包含谓词子对象。如果谓词类是默认构造的,那么这没有问题,但如果不是,则通常必须在容器构造函数中提供谓词的副本。
作为家庭作业,您可以考虑如何避免在谓词子对象上花费任何实际的内存。
答案 1 :(得分:1)
第二个模板参数_Prd被赋予一个默认类型,就像一个函数可以有参数的默认值。 STL大量使用它。以std :: basic_string为例看一下