【问题标题】:Why would you create a class with one single member which is an operator()? [duplicate]为什么要创建一个只有一个成员即 operator() 的类? [复制]
【发布时间】:2018-01-08 13:55:25
【问题描述】:

我试图找出一个很好的技术理由来定义一个只包含一个成员的类,而这个成员恰好是operator()

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

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

命名空间看起来像:

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

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

   ...
}

这仅仅是个人品味/风格的问题,还是高级/复杂设计的表现? 我假设这个设计包含一些我还没有收集到的智慧知识,但另一方面我还没有找到一篇讨论这个的文章或问题——这让我怀疑设计中的这种“智慧知识”。

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

提前致谢!

编辑

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

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

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

谢谢!

【问题讨论】:

  • 那么,您可以将此类的一个实例传递给库函数,这些库函数接受函子作为参数(例如std::sort)?
  • 研究术语“函子”
  • @DOUGLASO.MOEN,不,这些不是意见,而是可行性的技术解释。
  • 可调用对象至少在两个方面优于独立函数:更好的内联性和携带状态的能力。

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


【解决方案1】:

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

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

适用于函数和仿函数。或者,更好的例子是 STL 算法,例如 find_ifcopy_ifremove_if 等。它们都有一个模板参数,可以是函数、函子或(实际上是函子的一个例子)拉姆达。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 2018-08-26
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多