Как определить и использовать boost :: function с «необязательными аргументами»? - PullRequest
4 голосов
/ 04 марта 2011

Я использую класс, которому нужен какой-то метод обратного вызова, поэтому я использую boost :: function для хранения указателей на функции.

Мне нужен обратный вызов, чтобы иметь один необязательный аргумент, но я нашелиз-за того, что boost :: function не позволяет мне определять тип необязательных аргументов типа, поэтому я попробовал следующий код, и он сработал.и это законно?
есть ли лучшее решение?

1 Ответ

3 голосов
/ 04 марта 2011

Возможно, типовое отверстие безопасности в привязке -> преобразование функции. boost :: bind не возвращает std :: function , но является функциональным объектом очень сложного типа. В случае

boost::bind(&A::boo,a,_1);

как видно выше, возвращаемый объект имеет тип

boost::_bi::bind_t<
  int, 
  boost::_mfi::mf1<int,A,int>,
  boost::_bi::list2<boost::_bi::value<A*>, boost::arg<1> > 
>

std :: function только проверяет, является ли предоставленный объект функции «совместимым», в этом случае, может ли он быть вызван с int в качестве первого аргумента и указатель на символ в качестве второго аргумента. Изучив шаблон * boost :: bind_t *, мы увидим, что он действительно имеет соответствующий оператор вызова функции:

template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)

Внутри этой функции второй аргумент завершается молча отбрасыванием. Это по замыслу. Из документации: Любые дополнительные аргументы игнорируются (...)

...