Chciałbym w jakiś sposób uzyskać pierwszy typ parametru funkcji lambda, czy jest to możliwe?Uzyskaj typ parametru lambda:
np.
zamiast:
template<typename T>
struct base
{
virtual bool operator()(T) = 0;
}
template<typename F, typename T>
struct filter : public base<T>
{
virtual bool operator()(T) override {return /*...*/ }
};
template<typename T, typename F>
filter<T> make_filter(F func)
{
return filter<F, T>(std::move(func));
}
auto f = make_filter<int>([](int n){return n % 2 == 0;});
Chciałbym:
template<typename F>
struct filter : public base<typename param1<F>::type>
{
bool operator()(typename param1<F>::type){return /*...*/ }
};
template<typename F>
filter<F> make_filter(F func)
{
return filter<F>(std::move(func));
}
auto f = make_filter([](int n){return n % 2 == 0;});
podstawie odpowiedzi Xeo to jest to co mam pracę w VS2010:
template<typename FPtr>
struct arg1_traits_impl;
template<typename R, typename C, typename A1>
struct arg1_traits_impl<R (C::*)(A1)>{typedef A1 arg1_type;};
template<typename R, typename C, typename A1>
struct arg1_traits_impl<R (C::*)(A1) const>{typedef A1 arg1_type;};
template<typename T>
typename arg1_traits_impl<T>::arg1_type arg1_type_helper(T);
template<typename F>
struct filter : public base<typename std::decay<decltype(detail::arg1_type_helper(&F::operator()))>::type>
{
bool operator()(typename std::decay<decltype(detail::arg1_type_helper(&F::operator()))>::type){return /*...*/ }
};
template<typename T, typename F>
filter<F> make_filter(F func)
{
return filter<F>(std::move(func));
}
próbowałem uproszczenie kod, ale każda próba wydaje się go łamać.
Szukałam w jakimś triku z 'std :: fuction :: first_argument_type' jednak VS2010 nie wydaje się implemenet' first_argument_type'. – ronag
Skomplikowane. * Bardzo * skomplikowany, zwłaszcza bez szablonów variadic i VS2010. Będziesz potrzebował pewnego rodzaju funkcji-cech, które rozdzielają rzeczywisty typ wskaźnika funkcji na jego składniki i używają 'function_traits :: param1_type' lub tym podobne. VS2010 ma jednak problemy z tym kodem, niech zobaczę, czy mogę znaleźć moje pytanie na ten temat ... –
Xeo
Nie możesz użyć 'std :: function' do tego, ponieważ 'F' jest typem lambda, a nie podpisem jak 'bool (int)'. –
Xeo