这里虚拟运算符 ()() 的目的是什么?

What is the purpose of a virtual operator ()() here?

我正在尝试修改 code I found,但由于不了解此虚拟运算符的目的、重要性、and/or 相关性而受阻:

  1. 有人可以提供有关此运算符为何必要或有用的见解吗?
  2. 我认为它以parentItem()rect_resizer_为参数,然后修改resizer_的值对吗?

.h 中的构造函数:

virtual void operator()(QGraphicsItem* item, const QRectF& rect) = 0;

在 .cpp 中调用:

(*resizer_)(parentItem(), rect_);

构造函数的修剪上下文供参考:

class SizeGripItem : public QGraphicsItem
{
    private:

        class HandleItem : public QGraphicsRectItem
        {
            public:
                HandleItem(int positionFlags, SizeGripItem* parent);

            private:    
                SizeGripItem* parent_;
        };

    public:
        class Resizer
        {
            public:
                virtual void operator()(QGraphicsItem* item,
                                        const QRectF& rect) = 0;
        };

        SizeGripItem(Resizer* resizer = 0, QGraphicsItem* parent = 0);
        virtual ~SizeGripItem();

    private:
        void doResize();
        QRectF rect_;
        Resizer* resizer_;
};

关于第 2 点,考虑这一行:

(*resizer_)(parentItem(), rect_);

resizer_ 可能是指向未知类型 T 的对象的指针,因此 *resizer 是对相同类型 T 的对象的引用。
如果它有一个 operator() 的定义,它接受两个具有类型(让我说)decltype(parentItem())decltype(rect_) 的参数,您可以像在示例中那样调用它。
换句话说,它相当于:

resizer_->operator()(parentItem(), rect_);

根本不修改resizer_的值。

Can someone provide insight as to why this operator is necessary or useful?

嗯,这主要取决于上下文和它旨在解决的实际问题。
从一行代码很难说。
如果您觉得它没用,请不要使用它。就这些了。

Resizer是一个broken attempt at a (函数对象)。这样的习惯用法在 C++11 之前很有用。它被破坏了,因为如果没有虚拟析构函数,这样的仿函数是无用的。它应该如下所示:

class Resizer {
public:
  virtual void operator()(QGraphicsItem* item, const QRectF& rect) = 0;
  virtual ~Resizer() {}
};

这样的对象是可调用的:

void invokeResizer(Resizer * resizer, QGraphicsItem * item, const QRectF & rect) {
  (*resizer)(item, rect);
}

以上将在 resizer 对象上执行方法 operator()(QGraphicsItem*,const QRectF&)

在现代代码中,应该使用 std::function<void(QGraphicsItem*, const QRectF &)>.

而不是这样的 hack