Đưa ra một lambda, có thể tìm ra loại tham số và loại trả về không? Nếu có, làm thế nào?
Về cơ bản, tôi muốn lambda_traits
có thể được sử dụng theo những cách sau:
auto lambda = [](int i) { return long(i*10); };
lambda_traits<decltype(lambda)>::param_type i; //i should be int
lambda_traits<decltype(lambda)>::return_type l; //l should be long
Động lực đằng sau là tôi muốn sử dụng lambda_traits
trong một mẫu hàm chấp nhận lambda làm đối số và tôi cần biết loại tham số và loại trả về bên trong hàm:
template<typename TLambda>
void f(TLambda lambda)
{
typedef typename lambda_traits<TLambda>::param_type P;
typedef typename lambda_traits<TLambda>::return_type R;
std::function<R(P)> fun = lambda; //I want to do this!
//...
}
Hiện tại, chúng ta có thể giả sử rằng lambda có chính xác một đối số.
Ban đầu, tôi đã cố gắng làm việc với std::function
:
template<typename T>
A<T> f(std::function<bool(T)> fun)
{
return A<T>(fun);
}
f([](int){return true;}); //error
Nhưng nó rõ ràng sẽ cho lỗi. Vì vậy, tôi đã thay đổi nó thành TLambda
phiên bản của mẫu hàm và muốn xây dựng std::function
đối tượng bên trong hàm (như được hiển thị ở trên).