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

Why does std::binary_function<...> not have an operator() method?

本文关键字:operator 方法 没有 lt binary std function 为什么 gt      更新时间:2023-10-16

我注意到std::binary_function<...>只是一个带有typedefs的结构。在链接中,它特别说:

binary_function没有定义operator();预计派生类会定义这一点。

这对我来说似乎是荒谬的。如果你可以在没有函数的情况下继承它或实例化它,那么这个类(或结构)的意义何在?还是语义与在我看来不同?

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

binary_function只是一个帮助程序,用于创建(现在也已弃用的)函数适配器使用的 typedef,例如 not2 .请记住,在autodecltype可用之前,很难或不可能推断出这些类型,因此必须手动提供它们。另外,定义operator()有什么意义?不可能有一个可能的实现,pure virtual实施将是一个显著的性能消耗。

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

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

如果它有助于理解情况,请将binary_function视为标签或mixin,而不是接口。

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

这在您引用之后的文本中得到了回答。

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

这就是std::binary_function的目的。 以保证某些类型定义。