使用operator()

时间:2014-01-10 01:19:17

标签: c++ operators

我对()运算符几乎没有疑问。请帮我明白一点。

  1. ()运算符(()运算符重载)的用法是什么。
  2. 应该使用哪种情况。
  3. ()运算符使用的实际示例是什么(在哪些情况下,使用()运算符非常有用,方便或适合。)

2 个答案:

答案 0 :(得分:5)

它主要用于函数对象来模拟函数调用。

#include <iostream>

struct Functor
{
   void operator()() {
      std::cout << "lol\n";
   }
};

int main()
{
   Functor f;
   f();  // output: "lol"
}

Live demo

一个人为的例子,是的,但是这会使构造函数参数变得更加复杂,比如说,存储这个仿函数以用于算法。它在C ++标准库中很常见。


你没有 以这种方式使用它;另一个例子是模拟多维数组访问:

#include <vector>

template<typename T>
struct Matrix
{
   Matrix(unsigned m, unsigned n)
      : m(m), n(n), vs(m*n) {}

   T& operator()(unsigned i, unsigned j)
   {
      return vs[i + m * j];
   }

private:
   unsigned m;
   unsigned n;
   std::vector<T> vs;

};

/**    
 *       _~
 *    _~ )_)_~
 *    )_))_))_)
 *    _!__!__!_
 *    \______t/
 *  ~~~~~~~~~~~~~
 */
int main()
{
   const unsigned int WIDTH = 3;
   const unsigned int HEIGHT = 3;

   Matrix<long> m(WIDTH, HEIGHT);
   m(1,1) = 42;
}

这个是有用的,因为operator[]可能只接受一个参数(尽管该参数可以是初始化列表,这是一种解决方法)。

答案 1 :(得分:1)

()运算符用于制作所谓的函数对象aka“functor”

有一些非常有趣的事情,有一个函数对象可以做,包括传递一个函数对象作为参数。

我在下面发布的链接是我正在上课的一段视频,教授正在谈论仿函数。我发现它非常有用。 (注意:vid还讨论了类模板)

Functors and Templates