2012-11-06 47 views
0

我一直在试图理解这个代码模板中的typename U = equal_to <T>是什么意思? STL equal_to <T>使用

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>的使用,我发现从herehere参考。但仍然没有这样的事情。感谢您的帮助,让我了解这一部分。

更新:

看到的答案,阅读一些文字书后,我的问题变成2个方面。

1.默认模板参数

在C++ 11我们可以提供默认模板参数模板。 C++ primer第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) ; 

模板将使用默认的功能较少,对象类实例化。 然而,当我们用自己的目标:

Sales_data item(cin), item2(cin) ; 
bool j = compare (item, item2, compareIsbn) ; 

则F变成compareIsbn函数对象,而不是。 为了让我在上面的问题中发生同样的情况,这种方式将为模板的用户留下一个入口,以允许他们引入自己的函数对象,在这种情况下,它将用作比较器。

2.谓词

检查What is predicate in C++?

+1

看起来像是默认为==的等价谓词函子。 – chris

回答

2

std::equal_to是一个模板类,它提供了这样的事情:

bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; } 

换句话说,这是一个包装了函数对象类普通的==比较器。关键是equal_to可以是专用的,因此提供了添加可定制性的非侵入性方式。

最重要的是,您的模板Vector3还提供了侵入式通过第二个模板参数来自定义比较器的方法。

请注意谓词通常是对象,而不仅仅是特征类。所以你的容器实际上将包含一个谓词子对象。如果谓词类是可缺省构造的,这不成问题,但如果不是,则通常必须在容器构造函数中提供谓词的副本。

作为一项家庭作业,您可以考虑如何避免在谓词子对象上花费任何实际的内存

+0

非常感谢这个答案,它转向我必须理解C++中的谓词,如下所示:http://stackoverflow.com/questions/5921609/what-is-predicate-in-c。但如果你能向我展示更多细节或例子,那将会很好。那么什么是“通过第二个模板参数定制比较器的侵入性方式”? –

+0

@ tomriddle_1234:好的,指定你自己的比较器类。 –

+0

我更新了我的问题,检查我的例子是否正确,欢呼。 –

1

第二个模板参数_Prd被分配了一个默认类型,就像函数可以有参数的默认值一样。 STL严重使用它。以std :: basic_string为例