我注意到std::binary_function<...>
is only a struct with typedefs。在链接中,它具体说:
binary_function没有定义
operator()
;期望派生类将定义它。
这对我来说似乎毫无意义。如果你可以继承它,或者实例化它,而没有一个函数,那么这个类(或结构)有什么意义呢?或者语义是否与我们看起来不同?
答案 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
。请记住,在auto
和decltype
可用之前,很难或不可能推断出这些类型,因此必须手动提供。另外,定义operator()
的重点是什么?可能没有可能的实现,并且使pure virtual
成为显着的性能消耗。
答案 2 :(得分:2)
在您的引言之后的文本中回答了这一点。
某些标准库函数对象适配器(例如std :: not2,)要求它们适应的函数对象定义了某些类型; std :: not2要求函数对象适应具有名为first_argument_type和second_argument_type的两种类型。派生从binary_function中获取两个参数的函数对象是使它们与这些适配器兼容的简单方法。
这是std::binary_function
的目的。保证某些typedef。