【问题标题】:Why does std::binary_function<...> not have an operator() method?为什么 std::binary_function<...> 没有 operator() 方法?
【发布时间】:2015-04-02 16:31:11
【问题描述】:

我注意到std::binary_function&lt;...&gt; is only a struct with typedefs。在链接中,它特别说:

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

这对我来说似乎很荒谬。如果您可以继承或实例化它,而根本没有函数,那么这个类(或结构)的意义何在?还是语义与我认为的不同?

【问题讨论】:

  • 这就是结构的重点,您继承它并实现调用操作符功能。这使得创建以std::binary_function 作为参数的其他函数变得容易。当然可以使用模板来完成,但是通过使用std::binary_function,您可以明确说出预期的内容。

标签: c++ function functional-programming


【解决方案1】:

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

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

【讨论】:

  • “不可能实现”
  • C++ 语言和 C++ 标准库设计的指导原则是零开销原则(不要为不使用的东西付费)(参见 Stroustrup 的 C++ 设计和演变) . virtual 函数经常违反该原则,在许多情况下可以避免。
  • 是的,我的应用程序充满了微小的仿函数,这些仿函数通常根本不携带任何数据。 vtables 将是一个巨大的性能问题。
【解决方案2】:

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

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

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

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

【讨论】:

  • 1.无论如何,它是一个没有数据的结构,只需将其设为虚拟即可。 2. 按照这个逻辑,它可以是一个空结构,因为任何正常使用都会需要参数类型和返回类型,所以我们就让它成为一个空结构。我确实认为 binary_function 是一个混入 - 它是一个应该有一个 operator() 的混入。 3.我相信你在做一个人造人的论点:它是那样的,因为它是这样设计的;如果我们不使用运行时多态性,为什么不干脆完全放弃这个类呢?如果它可以像二进制函数一样使用,它就是二进制函数。
【解决方案3】:

你的引文后面的文字已经回答了这个问题。

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

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

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2021-01-02
    • 2020-05-03
    相关资源
    最近更新 更多