将函数作为参数传递的最佳方法

Ale*_*lex 4 c++ c++11

在C++中有几种方法可以将函数作为参数传递,但我想了解每种方法的优点和优点,例如,从算法中查看函数的签名:

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
Run Code Online (Sandbox Code Playgroud)

为什么std算法使用模板来传递函数而不是std :: function?

为什么线程使用移动语义和算法函数不?

template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);
Run Code Online (Sandbox Code Playgroud)

PS:我无视C中用作函数指针的方式.

Bri*_*ian 5

为什么std算法使用模板来传递函数而不是std :: function?

std::function在C++ 98中没有.一种替代方法是使具有Comparator虚拟成员函数的抽象基类被具体的比较器类覆盖,但模板版本更有效,因为它避免了虚拟调度的开销; 如果Compare是类类型,那么operator()通常可以内联.这也是反对std::function今天使用的论据.

为什么线程使用移动语义和算法函数不?

在C++ 98中也没有右值引用.

很容易看出,现在我们有rvalue引用和移动语义,不允许将值移动到线程中是愚蠢的(因为某些类型不可复制或无法有效复制).

为什么std::sort要按价值取比较?了解为什么函数对象应该按值传递以供讨论.

  • @Alex:如果函数的类型只能在运行时确定,或者它可以在运行时更改,则只需要使用`std :: function`.如果可以在编译时确定,则没有理由使用`std :: function`. (4认同)