【问题标题】:What does typename U = equal_to<T> in template mean ? STL equal_to<T> usage模板中的 typename U = equal_to<T> 是什么意思? STL equal_to<T> 用法
【发布时间】:2012-11-06 01:10:13
【问题描述】:

我一直在尝试理解这段代码

    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&lt;T&gt;的用法,我从herehere找到了参考。但仍然没有这样的东西。感谢您帮助我理解这部分内容。

更新:

在看到答案并阅读一些教科书后,我的问题转向了两个方面。

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 函数对象。 所以我上面的问题也会发生同样的情况,这种方式会给模板的用户留下一个入口,允许他们引入自己的函数对象,在这种情况下它被用作比较器。

2。谓词

查看What is predicate in C++?

【问题讨论】:

  • 看起来像一个谓词函子,默认为 == 等价。

标签: c++ templates generics


【解决方案1】:

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

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

换句话说,它是一个封装了普通==比较器的函数对象类。关键是equal_to 可以被专门化,因此提供了一种增加可定制性的非侵入性方式。

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

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

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

【讨论】:

  • 非常感谢您的回答,原来我必须理解 C++ 中的谓词,如 stackoverflow.com/questions/5921609/what-is-predicate-in-c。但是,如果您能向我展示更多详细信息或示例,那就太好了。那么“通过第二个模板参数自定义比较器的侵入性方式”是什么?
  • @tomriddle_1234:好吧,指定你自己的比较器类。
  • 我更新了我的问题,检查我的例子是否正确,干杯。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多