конверсия lambda в std::function
От: Vinick Россия  
Дата: 30.04.18 08:21
Оценка:
#include <string>
#include <functional>

template<typename U, typename F> class Bar;

template <typename T>
struct Foo {
    using value_type = T;
    template<typename U>
    Bar<U,Foo<T>> make_bar(std::function<U(const T&)> getter) {
        return Bar<U,Foo<T>>(*this,getter);
    }
};

template <typename U,typename F>
struct Bar {
    F & f;
    std::function<U(const F::value_type&)> getter;
    Bar(F & f_,std::function<U(const typename F::value_type &)> getter_):f(f_),getter(getter_) {
    }
};

int main() {
    Foo<std::string> foo;
    auto b = foo.make_bar<std::size_t>([](auto v) { return v.size();}); // <--- так работает
    //    auto b1 = foo.make_bar([](auto v) { return v.size();}); // <--- хочу вот так
    //   auto b2 = foo.make_bar([](auto v) ->std::size_t { return v.size();}); // <--- или хотя бы так
    return 0;
}


Есть ли способ избежать явной специализации при вызове make_bar?
с++14 lambda std::function
Re: конверсия lambda в std::function
От: Vinick Россия  
Дата: 30.04.18 08:30
Оценка:
Здравствуйте, Vinick, Вы писали:
Сам спросил, сам ответил

Оказывается можно сделать вот так
template <typename T>
struct Foo {
    using value_type = T;
    using this_type = Foo<T>;

    auto make_bar(auto getter) ->  Bar<decltype(getter(value_type())),this_type> {
     return Bar<decltype(getter(value_type())),Foo<T>>(*this,getter);
    }

};


Правда теперь требуется чтобы у T был конструктор по умолчанию, но это уже мелочи.
Re[2]: конверсия lambda в std::function
От: mbait  
Дата: 30.04.18 09:28
Оценка: 1 (1) +1
Здравствуйте, Vinick, Вы писали:

V>Правда теперь требуется чтобы у T был конструктор по умолчанию, но это уже мелочи.


Может быть тебе поможет declval?
Re[3]: конверсия lambda в std::function
От: Vinick Россия  
Дата: 01.05.18 02:16
Оценка:
Здравствуйте, mbait, Вы писали:

M>Здравствуйте, Vinick, Вы писали:


V>>Правда теперь требуется чтобы у T был конструктор по умолчанию, но это уже мелочи.


M>Может быть тебе поможет declval?


О! спасибо, теперь вобще со всеми типами работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.