为什么要创建一个 class,其中只有一个成员是 operator()?

Why would you create a class with one single member which is an operator()?

我试图找出 - 在那里 - 一个很好的技术理由来定义一个 class ,它只包含一个成员,而这个成员恰好是 operator().

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

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

名称空间类似于:

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

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

   ...
}

这只是个人taste/style的问题还是advance/sophisticated设计的表现? 我假设这个设计包含一些我还没有收集到的智慧知识,但另一方面我还没有找到一篇讨论这个的文章或问题 - 这让我对设计中的这种 "wise knowledge" 产生了怀疑。

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

提前致谢!

编辑

大家好! 我接受这个问题是一个重复的问题,其答案已找到 here.

我不知道 Functor 这个词,在试图找到我的疑问的答案时(在提交这个问题之前),我没有看到任何对这个词的引用。

我仍然接受 SergeyA 的回答,因为他的回答向我介绍了这个词,他的解释正在回答我的问题。他的回答 - 从我的角度来看 - 由 link 我在上面陈述的行中找到的答案扩展。

谢谢!

这种技术主要是通过通用编程和模板来实现的。为它定义了 operator() 的 class 称为 functor,这种 class 的美妙之处在于它可以在许多情况下与函数指针互换使用。例如:

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

将与函数和仿函数一起使用。或者,更好的例子是 STL 算法,例如 find_ifcopy_ifremove_if 等。它们都有一个模板参数,可以是函数、函子或(一个案例实际上是一个函子)一个 lambda。

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