帮助理解C ++,模板,operator()的类示例代码

时间:2010-07-20 02:15:55

标签: c++ templates operator-overloading

我不确定下面的类对于类示例到底做了什么。在下面的代码中,operator()在这种情况下做了什么?我没有得到*(开始+第一)和几乎整个返回表达式作为被评估的东西。任何帮助都会很棒。谢谢!

// IndexCompare.h - interface for IndexCompare class template
#ifndef _INDEXCOMPARE_H_
#define _INDEXCOMPARE_H_
#pragma once

template <class random_iterator>
class IndexCompare {
public:
    IndexCompare(random_iterator begin, random_iterator end)
        : begin(begin), end(end) {}

    ~IndexCompare() {}

    bool operator() (unsigned int first, unsigned int second) {
            return (*(begin + first) < *(begin + second));

    }

private:
    random_iterator begin;
    random_iterator end;
};

#endif

3 个答案:

答案 0 :(得分:2)

如果您询问operator ()做了什么,它可以让您像对待函数一样调用对象。有关示例,请参阅this article

如果你问的是你的例子中的函数是做什么的,那就是比较传递给函数的索引所指定的两个元素的值。 begin + first从迭代器first开始引用索引begin处的元素,类似begin + second*(begin + first)获取该位置的值。

您可以通过传入一对迭代器将此类用于任何STL容器(支持随机访问)。例如,您可以使用这样的矢量:

vector<int> vec;
/* add some elements here */
IndexCompare<vector<int>::iterator> compare(vec.begin(), vec.end());

现在调用compare(2, 5)会比较vec[2]vec[5]的值。

答案 1 :(得分:0)

begin是一个迭代器(思考指针),因此begin + first前进到第一个位置。 或者在第二种情况下,到第二种情况。但是,它不会修改begin本身。

*是一个解除引用运算符,它实际上是指向

的值

答案 2 :(得分:0)

operator()基本上是针对你的类定义'()'的功能。所以在这种情况下,如果我们和IndexCompare实例名为'ic',我们可以编写'ic()'并运行定义的功能,类似于函数调用和定义。

我希望这有助于理解运营商扩展。