Re: Реальность такого делегата
От: Кодт Россия  
Дата: 22.02.13 09:43
Оценка:
Здравствуйте, glap, Вы писали:

G>Один товарищ утверждает, что написал делегат который абстрагируется от сигнатуры функции и способен переварить нормально такой код:


Ну, это дело нехитрое. Ниже покажу, как.

G>Тоесть тут не будет у него ни UB ни исключения, а обе Foo получат что хотели.


А что хотели обе Foo? Могу предположить, что они хотели значение по умолчанию.

G> Я тут вижу одну нерешаемую проблему с безвозвратной утерей сигнатуры функции. Соответственно вызов оператора компилятору просто не сгенерироть.


class Connector
{
  boost::function< void(boost::any) > fun;

  template<class Arg>
  static void fun_impl(void(*f)(Arg), boost::any a)
  {
    if(Arg* v = boost::any_cast<Arg>(&a))
      f(*v);
    else
      f(Arg()); // или любое другое предпочитаемое поведение - не вызывать, кинуть исключение, etc...
  }

public:
  template<class Arg>
  Connector( void(*f)(Arg) ) : fun( boost::bind(fun_impl<Arg>, f, _1) ) {}

  void operator()(boost::any a) const { fun(a); }
};
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.