Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Работы над проблемой HOF

Сегодня совместно с zabivator разобрались с проблемой HOF.

Решили, что boost::function нарушает принцип zero penalty, и будем передавать ФВП как T.

Для вывода из T типа возврата и типов аргументов пришлось написать специальный класс deduce, на основе boost::function_types и показанной мне забиватором идиомы tag dispatching.

Теперь надо переделать генератор кода, чтобы функции передавались как T, и чтобы вызывался класс deduce. Другими словами, для flip нужно генерировать следующий маразм:

template <typename F>
struct flip_impl
{
	F f;

	typename deduce<F>::result_type flipped(
		typename deduce<F>::arg<1>::type b, 
		typename deduce<F>::arg<0>::type a)
	{
		return f(a, b);
	}
};

template <typename F>
typename boost::function<
	typename deduce<F>::result_type (
		typename deduce<F>::arg<1>::type,
		typename deduce<F>::arg<0>::type)>
flip(F f)
{
	flip_impl<F> impl = { f };
	return hn::bind(impl, &flip_impl<F>::flipped);
}
Subscribe

Recent Posts from This Journal

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments