【问题标题】:Help understanding class example code for C++, templates, operator()帮助理解 C++、模板、operator() 的类示例代码
【发布时间】:2010-07-20 02:15:55
【问题描述】:

我不确定以下类对类示例的作用。在下面的代码中,operator() 在这种情况下做了什么?我不太了解 *(begin + first) 和几乎整个返回表达式作为正在评估的内容。任何帮助都会很棒。谢谢!

// 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

【问题讨论】:

    标签: c++ templates operator-overloading


    【解决方案1】:

    如果您要问operator () 做了什么,它允许您像调用函数一样调用对象。示例见this article

    如果您要问示例中的函数在做什么,它会比较传递给函数的索引指定的两个元素的值。 begin + first 指从迭代器begin 开始的索引first 处的元素,类似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] 的值。

    【讨论】:

      【解决方案2】:

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

      * 是一个解引用运算符,它本质上是获取指向的值

      【讨论】:

        【解决方案3】:

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

        我希望这有助于理解操作符扩展。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 1970-01-01
          • 1970-01-01
          • 2014-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多