如果我们有boost :: bind,那么使用boost :: mem_fn是什么意思?

Jos*_*ino 13 c++ boost bind function-pointers

我正在查看C++技术报告1中包含的Boost库,并尝试了解每个库的功能.

我刚刚完成了一个例子boost::mem_fn,现在我想知道使用它的意义何在而不是更好boost::bind.据我所知,它们都返回一个指向成员函数的函数对象.我发现mem_fn这么有限,以至于我找不到使用它会比使用它更好的场景bind.

我错过了什么吗?有没有绑定不能取代mem_fn的情况?

Jef*_*rdy 6

mem_fn比它要小得多bind,所以如果你只需要mem_fn它的功能,那么需要很少的代码.


Old*_*ier 5

mem_fn比它更小更快bind.使用您喜欢的编译器尝试以下程序并进行比较:

  1. 生成的可执行文件的大小和
  2. 报告为花费的秒数.

你可以比较的性能bindmem_fn通过改变1到0的#if线.

#include <iostream>
#include <functional>
#include <chrono>

struct Foo
{
    void bar() {}
};

int main(int argc, const char * argv[])
{   
#if 1
    auto bound = std::bind( &Foo::bar, std::placeholders::_1 );
#else
    auto bound = std::mem_fn( &Foo::bar );
#endif
    Foo foo;
    auto start = std::chrono::high_resolution_clock::now();
    for( size_t i = 0; i < 100000000; ++i )
    {
        bound( foo );
    }
    auto end = std::chrono::high_resolution_clock::now();
    auto delta = std::chrono::duration_cast< std::chrono::duration< double >>( end - start );
    std::cout << "seconds = " << delta.count() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果会有所不同,但在我当前的系统mem_fn中,可执行文件的版本小了220个字节,运行速度大约是bind版本的两倍.

作为一个额外的功能,mem_fn不要求你记住添加std::placeholders::_1喜欢bind does(在模糊的模板编译错误的痛苦).

所以,mem_fn在你可以的时候更喜欢.