繁体   English   中英

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

[英]What's the point of using boost::mem_fn if we have boost::bind?

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

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

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

mem_fnbind小得多,所以如果你只需要mem_fn的功能,那么需要很少的代码。

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

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

您可以通过将#if行中的1更改为0来比较bindmem_fn的性能。

#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不需要你记得像bind does添加std::placeholders::_1 (在一个模糊的模板化编译器错误的痛苦)。

所以,你可以选择mem_fn

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM