为什么std :: binary_function< ...>没有operator()方法?

时间:2015-02-03 13:00:42

标签: c++ function functional-programming

我注意到std::binary_function<...> is only a struct with typedefs。在链接中,它具体说:

  

binary_function没有定义operator();期望派生类将定义它。

这对我来说似乎毫无意义。如果你可以继承它,或者实例化它,而没有一个函数,那么这个类(或结构)有什么意义呢?或者语义是否与我们看起来不同?

3 个答案:

答案 0 :(得分:4)

首先,没有operator()的实现可以放在基类中,这将是有用的。

其次,从binary_function派生的类的任何“正常”使用在某些时候都会在其上调用operator(),如果类没有实现它,则会导致编译器错误。这是因为binary_function不是多态基类 - 没有人应该尝试通过指针或operator()的引用来调用binary_function

如果有助于理解这种情况,请将binary_function视为标签或混合,而不是界面。

至于为什么它不是具有纯虚拟operator()的多态基类:标准库只是没有这样设计。它们被设计为使用模板,而不是运行时多态。多态仿函数包装器在C ++ 11中添加为std::function,但binary_function与此无关。

答案 1 :(得分:4)

请记住,C ++ 11已弃用,C ++ 17删除了binary_function

binary_function只是一个帮助器,用于创建(现在已弃用的)函数适配器使用的typedef,例如: not2。请记住,在autodecltype可用之前,很难或不可能推断出这些类型,因此必须手动提供。另外,定义operator()的重点是什么?可能没有可能的实现,并且使pure virtual成为显着的性能消耗。

答案 2 :(得分:2)

在您的引言之后的文本中回答了这一点。

  

某些标准库函数对象适配器(例如std :: not2,)要求它们适应的函数对象定义了某些类型; std :: not2要求函数对象适应具有名为first_argument_type和second_argument_type的两种类型。派生从binary_function中获取两个参数的函数对象是使它们与这些适配器兼容的简单方法。

这是std::binary_function的目的。保证某些typedef。