#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?