【问题标题】:unary_function and binary_function are deprecated in C++ 11, and removed in C++ 17. What should we use instead? [duplicate]Unary_Function和Binary_Function在C ++ 11中弃用,并在C ++ 17中删除。我们应该使用什么? [复制]
【发布时间】:2022-01-28 02:04:01
【问题描述】:

我一直在阅读 Meyers 的《Effective STL》。

我遇到了一些提到函数适配器对象的部分,例如not1bind1stbind2nd。显然有一系列这样的功能适配器对象,但是我以前从未遇到过这些。另一个例子是mem_funmem_fun_ref

其中许多继承自 unary_functionbinary_function。下面提供了一些链接。

https://en.cppreference.com/w/cpp/utility/functional/unary_function

https://en.cppreference.com/w/cpp/utility/functional/binary_function

https://en.cppreference.com/w/cpp/utility/functional/mem_fun

这些对象在 C++ 11 中被贬低,这可能解释了为什么我以前没有遇到过它们。

为什么不推荐使用它们,以及取而代之的是什么?我的直觉告诉我,lambda 可以替换这样的函数对象,并且在阅读本书时我确实想到 STL 容器上的一些排序操作可以使用 lambda 而不是函数对象来描述。

  • lambda 是否完全取代了这些“适配器函数”。
  • 如果是这样,函数对象在 C++ 11 之后仍然有用吗?如果它们在 STL 中已过时,这是否意味着函数对象在 C++ 11 中的任何地方都已过时,还是仍然有用途?

作为最后的评论,是否有任何关于 STL 的现代书籍可以很好地替代 Meyers Effective STL?我从阅读他的书中学到了很多东西,但其中包含过时信息的部分可能比我目前意识到的要多。

【问题讨论】:

  • mem_fun 替换为 mem_fn
  • 关于术语的小问题:这些东西已弃用,而不是贬值。没有“我”。
  • 我已经回滚了您的编辑请求书籍建议。此类请求在网站上不合适;请不要再次尝试编辑它。

标签: c++ c++11 stl function-object


【解决方案1】:

您可以使用以下之一:

  • Lambda 表达式
  • std::bind
  • std::mem_fn

lambda 是否完全取代了这些“适配器函数”。

从 C++14 开始,lambdas 可以做所有已弃用和后来删除的仿函数模板可以做的事情。

如果是这样,函数对象在 C++ 11 之后仍然有用吗?

Lambdas 函数对象。

如果您要问编写命名函数类模板是否仍然有用:是的,它仍然偶尔有用。


通过编写返回 lambda 的命名函数,Lambda 可以同样可重用。

你能添加...一个例子吗?

这是一个例子:

constexpr auto
reusable_lambda() noexcept
{
    return []{
        return "Just an example";
    };
}

【讨论】:

  • 是的,我的问题是写一个命名函数对象是否有用。我猜“可重用性”是唯一的用例?换句话说,不是在几个地方重复相同的 lambda 块?
  • @FreelanceConsultant Lambda 可以通过编写一个返回 lambda 的命名函数来同样可重用。区别主要在于语法。有时你需要命名函子的类型,这就是 lambdas 有点麻烦的地方。
  • 我以前没见过。您可以添加指向参考的链接或示例吗?再说一次,这不是我迄今为止遇到的事情。
  • @FreelanceConsultant 查看示例。
  • @FreelanceConsultant reusable_lambda 是一个函数。它返回一个函子。 Lambda 表达式本质上是函子的语法糖。
猜你喜欢
  • 2014-04-18
  • 2019-01-15
  • 1970-01-01
  • 2017-01-23
  • 2014-11-09
  • 2011-07-26
  • 2010-10-08
  • 2020-12-14
  • 2011-03-10
相关资源
最近更新 更多