2010-06-21 3 views
2

Я только что работал с 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; 

} 
+0

Я не знаю точно, является ли это «нормальным», но, я думаю, это так. Сигналы и слоты Qt' также позволяют это делать. – ereOn

ответ

6

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

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

+1

Я думаю, я удивлен, что он делает это неявно, так как он очень придирчив к функциям подписи во всех других обстоятельствах. Я понимаю boost :: bind довольно хорошо уже, и я просто никогда не видел это как вариант использования. – radman

+2

@radman Я с тобой. Я думаю, что я бы предпочел, чтобы в этом случае возникали ошибки повышения. Я нахожу это более тревожным, чем удобство. – Omnifarious

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) 

h.

+0

Извините, но вопрос находится в другом направлении, где вы привязываете метод, переводящий n параметров в метод, принимающий n + x параметры. Я уже хорошо знал, что вы описываете, спасибо за ответ, хотя. – radman

+0

На днях я должен научиться читать, я думаю;) извините! тем не менее ... это не все так, как правильно? Вы можете предоставить любую старую функцию C с большим количеством аргументов, чем она на самом деле использует, пока - * на сайте вызова * - прототип и количество аргументов совпадают. main() - прекрасный пример этого;) – haavee

Смежные вопросы