C++ 算法中的“函数”和“类函数实体”有什么区别?

Mor*_*rse 2 c++ c++20 std-ranges

在 C++20 中,新的命名空间std::ranges被添加到标准中,其中许多算法复制了现有的算法,例如std::find_ifstd::ranges::find_if。在cppreference 页面上,“旧”算法被称为“函数”,“新”算法被称为“类函数实体”。然而,我不能以“功能”的方式使用它,例如

auto result = myMapObj
                | std::ranges::views::keys
                | std::ranges::find_if([](const auto& key) { return key == 42; });
Run Code Online (Sandbox Code Playgroud)

我需要像旧的一样使用它std::find_if。那么有什么区别,在什么情况下我应该选择哪一个呢?

Hol*_*Cat 5

它们是具有重载的全局对象operator()

foo(std::ranges::find_if)以这种方式设计它们有一些边际好处(与函数模板相比),例如能够使用合理的语法将它们作为参数传递给其他函数( )(要std::find_if以这种方式传递,您需要将其包装在 lambda 中) )。

在什么情况下我应该选择哪一个?

std::ranges::...假设您的标准库实现支持它们,您应该始终更喜欢这些版本。

  • 其他优点包括实际上将实现细节隐藏为私有成员函数的可能性。最棒的福利是:没有 ADL。当使用这样的对象时,调用者无法通过 ADL 绕过它(无论是否自愿..):这真的很棒,因为这样您实际上可以随时强制执行类型检查! (3认同)
  • “*能够将它们作为参数传递给其他函数*”这不是真的,niebloid 不保证对象性,尽管目前它们只能以对象的形式实现。这种缺乏保证的情况并不会带来任何好处,会给用户带来不便,这就是为什么 MSVC-STL 最近计划将其转变为可复制的 CPO [#4097](https://github.com/microsoft/STL/issues/4097) )。 (2认同)