ラムダ関数の最初のパラメータ型を取得する方法はありますか?ラムダパラメータ型を取得
代わりに:私は希望
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;});
:
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;});
XEOの回答に基づいて、これは私が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));
}
私が単純化しようとしましたコードは、しかし、任意の試みはそれを破るようだ。
が、しかし、VS2010は' first_argument_type'をimplemenetしていないようです。 – ronag
複雑。 *非常に*複雑な、特にvariadicテンプレートとVS2010なし。関数ポインタの実際の型をそのコンポーネントに分割し、 'function_traits :: param1_type'などを使用する、ある種の関数型が必要になります。 VS2010はそのコードに問題がありますが、私が私の質問を見つけることができるかどうかを見てみましょう... –
Xeo
'std :: function'は 'F'がラムダ型で署名ではないので使用できません'bool(int)'のように。 –
Xeo