Как может boost :: bind не соответствует предоставленной подписи, но работает нормально? - PullRequest
3 голосов
/ 26 июля 2010

Моя путаница похожа на этот код:

 #include "stdafx.h"
#include <boost/bind.hpp>

using namespace std;

void fool(std::string s)
{
 std::cout<<s<<endl;
}

void fool2()
{
 std::cout<<"test2 called\n"<<endl;
}

void fool3(std::string s1,std::string s2)
{
 std::cout<<"test3 called\n"<<endl;
}

typedef boost::function<void(std::string)> myHandler;
void mywait(myHandler handler)
{
 handler("hello my wait");
}

int main()
{
 mywait(boost::bind(fool,_1));  //it works fine as expected.

 mywait(boost::bind(fool2));   //how it works? fool2  doesnot match the  signature of  "boost::function<void(std::string)>"

 //mywait(boost::bind(fool3,_1,_2)); //if fool2 works fine, why  this not work?
 return 0;
}

следующая ссылка - тот же вопрос.

http://forums.opensuse.org/english/development/programming-scripting/441878-how-can-boost-bind-swallow-argument-member-function.html

Я только что прочитал статью: [Как библиотека Boost Bind может улучшить ваши программы на C ++] и документ о поддержке Bind

те просто говорят, что это работает, но я не знаю почему. я все еще в замешательстве.

извините за мой плохой английский.

1 Ответ

1 голос
/ 26 июля 2010

Одна из замечательных особенностей Boost.Bind - это возможность "втирать" функцию в несколько иную сигнатуру.

Например, вы можете заставить свой пример fool3 работать, явно указавзначение для второго параметра:

mywait(boost::bind(fool3, _1, "extra parameter"));
// or even:
mywait(boost::bind(fool3, "extra parameter", _1));

Любые параметры, передаваемые в функцию, которые не используются (посредством _ n ), просто игнорируются при вызове функции.

...