เมื่อพิจารณาแลมบ์ดาเป็นไปได้ไหมที่จะหาประเภทพารามิเตอร์และประเภทการส่งคืน ถ้าใช่อย่างไร
โดยพื้นฐานแล้วฉันต้องการlambda_traits
ที่สามารถใช้ในรูปแบบต่อไปนี้:
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
แรงจูงใจเบื้องหลังคือฉันต้องการใช้lambda_traits
ในเทมเพลตฟังก์ชันซึ่งยอมรับแลมบ์ดาเป็นอาร์กิวเมนต์และฉันจำเป็นต้องรู้ว่าเป็นประเภทพารามิเตอร์และประเภทผลตอบแทนภายในฟังก์ชัน:
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!
//...
}
ในขณะนี้เราสามารถสันนิษฐานได้ว่าแลมบ์ดาใช้อาร์กิวเมนต์เดียว
เริ่มแรกฉันพยายามทำงานกับstd::function
:
template<typename T>
A<T> f(std::function<bool(T)> fun)
{
return A<T>(fun);
}
f([](int){return true;}); //error
แต่เห็นได้ชัดว่าจะให้ข้อผิดพลาด ดังนั้นฉันจึงเปลี่ยนเป็นTLambda
เวอร์ชันของเทมเพลตฟังก์ชันและต้องการสร้างstd::function
วัตถุภายในฟังก์ชัน (ดังที่แสดงด้านบน)