Здравствуйте, 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); }
};