为什么这样做?

时间:2010-06-21 07:04:19

标签: c++ function boost bind

我刚刚与boost::bindboost::function合作,并注意到以下行为(我认为这有点奇怪)。您可以使用boost :: function类型所需的参数来绑定一个函数!看起来似乎只是忽略了任何其他参数而只是消失了。

那为什么这种行为是正确的?我的期望是应该引发编译错误,说明不兼容。

请参阅下文,了解显示问题的工作代码示例

#include "boost/bind.hpp"
#include "boost/function.hpp"

namespace
{
  int binder(const char& testChar, 
             const int& testInt, 
             const std::string& testString)
  {
    return 3;
  }

}

int main(int c, char** argv)
{
  boost::function<int(const char&, 
                      const int&, 
                      const std::string&, 
                      const float&, 
                      const std::string&, 
                      const int&)> test;
  test = boost::bind(&::binder, _1, _2, _3);

  std::cout << test('c', 1, "something", 1.f, "more", 10) << std::endl;

}

2 个答案:

答案 0 :(得分:6)

这不是boost::bind的重点 - 允许你重新映射函数的原型吗?您使test可用于6个输入参数,其中您的基础函数只需要3个。

此页面:http://blog.think-async.com/2010/04/bind-illustrated.html非常了解boost::bind的工作原理。

答案 1 :(得分:0)

它是函数式编程的范例,currying:http://en.wikipedia.org/wiki/Currying意味着你将一个带有0个以上参数的函数转换为一个参数较少的函数,并且你提供的函数是常量;你提供的价值。

E.g。使用bind / currying你可以这样做:

// takes 2 arguments
function multiply(x,y) { return x*y; }

// make shorthand for multiply-by-two
function mult_by_two(x) =  multiply(x, 2)

小时。