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

时间:2010-06-21 19:57:20

标签: c++ boost function-pointers bind

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

我刚刚为boost::mem_fn运行了一个示例,现在我想知道使用它而不是更好的boost::bind是什么意思。据我所知,它们都返回一个指向成员函数的函数对象。我发现mem_fn非常有限,以至于我找不到使用它比bind更好的情况。

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

4 个答案:

答案 0 :(得分:6)

mem_fnbind小得多,因此如果您只需要mem_fn的功能,那么可以使用更少的代码。

答案 1 :(得分:5)

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

  1. 生成的可执行文件的大小和
  2. 报告的花费的秒数。
  3. 您可以通过将bind行中的1更改为0来比较mem_fn#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;
    }
    

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

    作为额外功能,mem_fn并不要求您记住添加std::placeholders::_1之类的bind does(因为模糊的模板化编译错误)。

    所以,请尽可能选择mem_fn

答案 2 :(得分:2)

好吧,bind取决于mem_fun所以你去了。如何以及为什么我会留下让你发现因为虽然有趣,我现在还没有时间调查(绑定很复杂)。

答案 3 :(得分:1)

boost::lambda功能与您提到的两个功能类似。我认为他们都有类似的意图,大约在同一时间,采用不同的方法,导致混乱和不兼容问题。如果他们都在一个lambda伞下合并,那就太好了。

所以,不,没有任何总体设计要求两个库共存。