代码之家  ›  专栏  ›  技术社区  ›  José Tomás Tocino

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

  •  13
  • José Tomás Tocino  · 技术社区  · 16 年前

    我正在看C++中的技术报告1中包含的Boost库,并试图了解每个程序所做的事情。

    我刚刚完成了一个例子 boost::mem_fn 现在我想知道用它代替更好的有什么意义 boost::bind . 据我所知,它们都返回指向成员函数的函数对象。我发现 mem_fn 太有限了,我找不到比使用它更好的方案 bind .

    我错过什么了吗?是否存在bind无法替换mem_fn的情况?

    4 回复  |  直到 13 年前
        1
  •  6
  •   Jeff Hardy    16 年前

    mem_fn 比 bind 如果您只需要 Mimyfn 它的代码要少很多。

        2
  •  5
  •   OldPeculier    13 年前

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

    1. 生成的可执行文件的大小和
    2. 报告为已用的秒数。

    您可以比较 绑定 对战 Mimyfn 将中的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;
    }
    

    结果会有所不同,但在我当前的系统中 Mimyfn 可执行文件的版本小220字节,运行速度大约是 绑定 版本。

    作为奖励功能, Mimyfn 不需要你记住添加 std::placeholders::_1 喜欢 bind does (由于一个模糊的模板化编译器错误)。

    所以,更喜欢 Mimyfn 你可以的时候。

        3
  •  2
  •   Edward Strange    16 年前

    好吧,绑定取决于Mem ou的乐趣,所以你去吧。我将如何和为什么离开这里让你去发现,因为尽管很有趣,我现在还没有时间去调查(绑定很复杂)。

        4
  •  1
  •   John    16 年前

    boost::lambda 与您提到的两个功能有类似的重叠。我认为它们都是以相似的意图进化而来的,大约在同一时间,使用不同的方法,导致混乱和不兼容问题。如果他们都合并在一起就好了 lambda 雨伞。

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

    推荐文章