为什么 std::binary_function<...> 没有 operator() 方法?
Why does std::binary_function<...> not have an operator() method?
我注意到std::binary_function<...>
只是一个带有typedefs的结构。在链接中,它特别说:
binary_function没有定义
operator()
;预计派生类会定义这一点。
这对我来说似乎是荒谬的。如果你可以在没有函数的情况下继承它或实例化它,那么这个类(或结构)的意义何在?还是语义与在我看来不同?
请记住,C++11 已弃用,C++17 删除binary_function
。
binary_function
只是一个帮助程序,用于创建(现在也已弃用的)函数适配器使用的 typedef,例如 not2
.请记住,在auto
和decltype
可用之前,很难或不可能推断出这些类型,因此必须手动提供它们。另外,定义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
的目的。 以保证某些类型定义。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 调用模板方法会导致'operator<'不匹配
- 为什么 std::binary_function<...> 没有 operator() 方法?
- 如果 std::basic_string::operator[] 也是非 const 方法,为什么它是 const 方法?
- c++中使用% operator和/ operator的替代方法
- 是否有一种方法可以重载operator=来为右边的函数提供特定的行为?
- 是否有一种方法可以将可变参数包中的所有类指定为模板的友类,以便使用operator=
- 如何使用 'llvm::ilist_iterator<NodeTy>::operator pointer() const' 方法?