Я использую класс, которому нужен какой-то метод обратного вызова, поэтому я использую boost:: function для хранения указателей функций.
мне нужно, чтобы обратный вызов имел один необязательный аргумент, но я обнаружил, что boost:: function не позволит мне определить тип необязательных аргументов, поэтому я попробовал следующий код, и он сработал.
//the second argument is optional
typedef boost::function< int (int, char*)> myHandler;
class A
{
public:
//handler with 2 arguments
int foo(int x,char* a) {printf("%s\n",a); return 0;};
//handler with 1 argument
int boo(int x) {return 1;};
}
A* a = new A;
myHandler fooHandler= boost::bind(&A::foo,a,_1,_2);
myHandler booHandler= boost::bind(&A::boo,a,_1);
char* anyCharPtr = "just for demo";
//This works as expected calling a->foo(5,anyCharPtr)
fooHandler(5,anyCharPtr);
//Surprise, this also works as expected, calling a->boo(5) and ignores anyCharPtr
booHandler(5,anyCharPtr);
Я был потрясен тем, что это сработало, вопрос в том, должно ли это работать и законно ли это?
есть ли лучшее решение?
//surprise
, а то, что вы можете объявитьbooHandler
как типmyHandler
. - person Benoit   schedule 04.03.2011