【发布时间】:2013-12-19 17:08:24
【问题描述】:
使用this question(和其他一些人)的洞察力,我已经能够编写以下代码来询问正常的 lambda 函数类型信息(即返回类型、参数计数等)
// helper classes ========================================
template <typename R, typename... A>
class lambda_traits_evaluation {
public:
typedef R r_type;
enum { n_args = sizeof...(A) };
// ...
};
template <typename R, typename... A>
class lambda_traits_helper
: public lambda_traits_evaluation<R,A...>{};
template <typename R, typename F, typename... A>
class lambda_traits_helper<R (F::*)(A...) const>
: public lambda_traits_evaluation<R,A...>{};
// use class ========================================
template <typename F>
class lambda_traits {
typedef typename lambda_traits_helper<decltype(&F::operator())> helper_impl;
// ...
}
然后我可以将它与lambda_traits<decltype(myLambda)> 一起使用,但这就是我自鸣得意的编码结束的地方,因为如果我的 lambda 是 gpu 的放大器限制,即
auto myLambda = [](int) restrict(amp) -> void {};
显然模板专业化没有被选中。但是添加新的专业化
template <typename R, typename F, typename... A>
class lambda_traits_helper<R (F::*)(A...) const restrict(amp)>
: public lambda_traits_evaluation<R,A...> {};
仍然没有解决问题,因为我发现编译器吠叫
error C3939: 'abstract declarator' : pointer to member functions, function
pointers, references to functions with 'amp' restriction
specifier are not allowed
是否有另一种方法来询问 lambdas 中的类型,或者有一种方法可以去除 lambda 类型的限制?
【问题讨论】:
标签: visual-c++ lambda template-specialization c++-amp restrict-qualifier