C++ typename U=等于<;什么;T>;什么意思?STL等于<;T>;使用

C++ typename U=等于<;什么;T>;什么意思?STL等于<;T>;使用,c++,templates,generics,C++,Templates,Generics,我一直在努力理解这个代码 template <typename T, typename _Prd = equal_to<T> > struct Vector3 { protected: T i,j,k; _Prd comp; public: //default constructor Vector3(void); //explicit construc

我一直在努力理解这个代码

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

        ...
};
模板将使用默认的less函数对象类进行实例化。 但是,当我们使用自己的对象时:

Sales_data item(cin), item2(cin) ;
bool j = compare (item, item2, compareIsbn) ;
然后F转而使用compareIsbn函数对象。 同样的情况也发生在我上面的问题上,这种方式会给模板的用户留下一个入口,允许他们引入自己的函数对象,在这种情况下,它被用作比较器

2。谓词


Check

std::equal_to
是一个类模板,它提供如下内容:

bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; }
换句话说,它是一个函数对象类,它封装了普通的
==
比较器。关键是
equal_to
可以专门化,因此提供了一种非侵入式的方式来增加可定制性

除此之外,模板
Vector3
还提供了一种通过第二个模板参数定制比较器的侵入式方法

注意,谓词通常是对象,而不仅仅是特征类。因此,您的容器实际上将包含一个谓词子对象。如果谓词类是默认可构造的,这没有问题,但如果不是,则通常必须在容器构造函数中提供谓词的副本


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

std::equal_to
是一个类模板,它提供如下内容:

bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; }
换句话说,它是一个函数对象类,它封装了普通的
==
比较器。关键是
equal_to
可以专门化,因此提供了一种非侵入式的方式来增加可定制性

除此之外,模板
Vector3
还提供了一种通过第二个模板参数定制比较器的侵入式方法

注意,谓词通常是对象,而不仅仅是特征类。因此,您的容器实际上将包含一个谓词子对象。如果谓词类是默认可构造的,这没有问题,但如果不是,则通常必须在容器构造函数中提供谓词的副本


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

第二个模板参数\u Prd被指定为默认类型,就像函数可以为参数指定默认值一样。STL大量使用这种方法。以std::basic_string为例

第二个模板参数_Prd被指定为默认类型,就像函数可以为参数指定默认值一样。STL大量使用这种方法。看一下STD::Basic字符串作为一个例子,

看起来像一个谓词函子,默认为等价的==。看起来像一个谓词函子,默认为等价= =。谢谢你这么多的答案,它变成了我必须理解C++中的谓词。但如果你能给我看更多的细节或例子,那就太好了。那么,“第二模板参数定制比较器的方法是什么?”@ TimRIDLY1212:好的,指定你自己的比较器类。我更新了我的问题,检查我的例子是否正确,欢呼。谢谢你的回答,它变成了我必须理解C++中的谓词。但如果你能给我看更多的细节或例子,那就太好了。那么,“通过第二个模板参数定制比较器的侵入式方法”是什么?@tomridle_1234:好吧,指定您自己的比较器类。我更新了我的问题,检查我的示例是否正确,干杯。
Sales_data item(cin), item2(cin) ;
bool j = compare (item, item2, compareIsbn) ;
bool operator()(T const & lhs, T const & rhs) const { return lhs == rhs; }