【发布时间】:2012-01-03 11:48:51
【问题描述】:
我想要一些方法来获取 lambda 函数的第一个参数类型,这可能吗?
例如
代替:
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));
}
我尝试过简化代码,但任何尝试似乎都会破坏它。
【问题讨论】:
-
我在看
std::fuction::first_argument_type的一些技巧,但是VS2010 似乎没有实现first_argument_type。 -
复杂。 非常复杂,尤其是没有可变参数模板和VS2010。您将需要某种函数特征,将函数指针的实际类型分解为其组件并使用
function_traits<decltype(&F::operator())>::param1_type等。不过 VS2010 的代码有问题,让我看看我是否能找到关于它的问题... -
您不能为此使用
std::function<F>,因为F是lambda 类型,而不是像bool(int)这样的签名。 -
我很好奇:为什么过滤器需要知道函数的参数?你不能用可变参数写一个通用的完美转发函数吗?
-
因为 filter 有一个方法,例如
operator()(T)需要知道参数类型。
标签: c++ visual-studio-2010 templates c++11 typetraits