Почему это работает? - PullRequest
       5

Почему это работает?

2 голосов
/ 21 июня 2010

Я только что работал с boost::bind и boost::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 ]

6 голосов
/ 21 июня 2010

Не в этом ли смысл boost::bind - чтобы позволить вам переназначить прототип функции?Вы заставляете test быть пригодным для использования с 6 входными параметрами, где вашей базовой функции нужно только 3.

Эта страница: http://blog.think -async.com / 2010/04 / bind-illust. illust. имеет действительно хороший обзор того, как работает boost::bind.

0 голосов
/ 21 июня 2010

Это парадигма функционального программирования, каррирование: http://en.wikipedia.org/wiki/Currying означает, что вы преобразуете функцию, принимающую более 0 параметров, в функцию, принимающую меньше параметров, а те, которые вы указали, заполнены, чтобы быть постоянными; значения, которые вы указали.

например. используя bind / curry, вы можете сделать это:

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

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

ч.

...