Используя понимание этого вопроса (и некоторых других) Я смог написать следующее для запроса информации о типе нормальной лямбда-функции (например, тип возвращаемого значения, количество аргументов и т. Д.)
// 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)>
, но на этом мое самодовольное кодирование заканчивается, потому что, если моя лямбда ограничена для 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
есть ли другой способ опросить типы в лямбда-выражениях или способ снять ограничение с лямбда-типа?