lambda overload set
От: alexeiz  
Дата: 05.11.12 07:17
Оценка: 208 (15) -1
Недавно где-то увидел интересную идею, заключающуюся в том, что мы можем налету создать объект, который будет иметь много перегруженных operator()-ов, определяемых через лямбда функции. Что-то вроде перегрузки функций, только для лямбд.

    auto f = overload(
        [] { return 1; },                // 1
        [] (int x) { return x + 1; },    // 2
        [] (double x) { return 2 * x; }  // 3
        );

    using std::cout;
    using std::endl;
    cout << f() << endl         // call 1
         << f(1) << endl        // call 2
         << f(2.0) << endl;     // call 3


Как это реализовать, спросите? Через наследование от лямбда функций!

template <typename ...Funcs>
struct overload_set;

template <typename Head, typename ...Tail>
struct overload_set<Head, Tail...> : Head, overload_set<Tail...>
{
    overload_set(Head head, Tail... tail)
        : Head{head}
        , overload_set<Tail...>{tail...}
    {}

    using Head::operator();
    using overload_set<Tail...>::operator();
};

template <typename Func>
struct overload_set<Func> : Func
{
    overload_set(Func func)
        : Func{func}
    {}

    using Func::operator();
};

template <typename ...Funcs>
overload_set<Funcs...> overload(Funcs... funcs)
{
    return overload_set<Funcs...>{funcs...};
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.