Dedukcja typów - inne zastosowanie

0
template<typename Function, Function function>
struct func_helper;

template<typename Result, typename... Args, Result (*function)(Args...)>
struct func_helper<Result (*)(Args...), function>
{
	static std::function<Result(Args...)> get()
	{
		return function;
	}
};

// usage:
// func_helper<decltype(&func), &func>::get()

Czy zna ktoś lub istnieje jeszcze jakieś inne zastosowanie takiego rodzaju dedukcji typu? W sensie, że typ może zostać rozbity - tak jak w przypadku argumentu szablony, który jest funkcją.

0
  1. Wszelkie boost::bind-y, std::bind-y i prawdopodobnie lambdy używają wewnętrznie podobnego mechanizmu.
    Boost::bind wykorzystuje szablony niemal w identyczny sposób do dedukcji typu argumentów, kontekstu oraz typu zwracanego
    z przekazywanego wskaźnika na metodę R (T::*method)(Args...).
    W uproszczeniu wygląda to tak:
 
template<class R, class T, class... Args>
binder<R, T, Args...> my_bind(R (T::*method)(Args...),
                                         const T &context, const placeholder &)
{
        return binder<R, T, Args...>(method, context);
}

gdzie binder jest z kolei obiektem funkcyjnym zwracanym przez bind-a i przedstawia się
mniej więcej tak:

 
template<class R, class T, class... Args>
class binder
{
    typedef R (T::*Method)(Args...);

    public:
        binder(Method method, T context)
            : method_(method),
              context_(context)
        {
        }

        R operator ()(Args... args)
        {
            return (context_.*method_)(args...);
        }

    private:
        Method method_;
        T context_;
};
  1. Różnego rodzaje message/event dispatchery, które z natury pracują na zbiorze zarejestrowanych handler-ów
    (a więc znowu obiekty std::function) i muszą jakoś dopasować jednego z nich do aktualngo msg-a/eventa/grupy argumentów.
    Z bardziej hardkorowych to np. ten tutaj http://stackoverflow.com/questions/25714390/is-it-possible-to-do-this-lambda-event-manager-in-c
    w function_traits dokonuje dedukcji wskaźnik na metodę R(C::*)(Args...) -> std::tuple<Args...>

1 użytkowników online, w tym zalogowanych: 0, gości: 1