为什么要创建一个具有一个operator()的单个成员的类?

时间:2017-08-01 15:43:06

标签: c++ oop operator-overloading operator-keyword

我试图在那里找出 - 一个很好的技术原因来定义一个只包含一个成员的类,这个成员恰好是operator()

我偶然发现了一个人 - 无论出于何种原因 - 创建了一个包含几个类的命名空间,但每个类只包含一个operator()作为成员。

我很清楚,这些类可能会被用作方法(非常可能),但为什么这是一个很好的技术方法(我假设有一个很好的方法),而不是简单地定义一组单例类中的不同方法,在这种特殊情况下属于上面提到的命名空间。

命名空间类似于:

namespace myNamespace {
   class ClassA {
   public:
      void operator()();
   };

   class ClassB {
   public:
      int operator()(arg1, arg2);
   };

   ...
}

这仅仅是个人品味/风格的问题还是这是先进/精致设计的表现? 我认为这个设计包含了一些我尚未收集到的明智知识,但另一方面,我没有找到一篇文章或问题来讨论这个问题 - 这让我怀疑设计中的这种“明智的知识”。 / p>

这里的专家有什么要说的?

提前致谢!

修改

再次问好! 我接受这个问题是一个重复的问题,其答案是here

“Functor”这个词我不知道,在试图找到我怀疑的答案时(在提出这个问题之前),我没有看到任何关于这个术语的引用。

我仍然接受谢尔盖的回答,因为他的回答向我介绍了这个词,他的解释是回答我的问题。他的答案 - 从我的观点来看 - 延伸到我在上面所说的链接中找到的答案。

谢谢!

1 个答案:

答案 0 :(得分:6)

这种技术主要是通用编程和模板。为其定义operator()的类称为functor,这类的优点在于它可以在很多情况下与函数指针互换使用。例如:

template<class F>
void call_f(F f) {
    f();
}

可以使用函数和函子。或者,更好的示例是STL算法,例如find_ifcopy_ifremove_if等。所有这些算法都有一个模板参数,可以是函数,函子或(案例)实际上是一个函子的一个lambda。

这类课程的另一个好处是它的类型定义了它的对象。函数指针只是一个函数指针,它总是需要指向一个特定的函数。但对于无状态仿函数(没有任何成员的仿函数),类型足以根据需要重新创建对象。例如,std::less用于std::map。它没有采用比较的实际对象,而是它的类型并从就地类型创建对象。