Có một số câu hỏi về SO liên quan đến việc truyền lambdas đến std::function
s, nhưng tôi chưa thấy một gói sử dụng gói tham số cho danh sách đối số. Điều này có vẻ bị hỏng trên phiên bản g ++ của tôi (7.1.1-4) và có thể nó không được hỗ trợ. Vì vậy, điều này là hợp pháp c + + 17 (theo tiêu chuẩn)? Nếu không, tại sao?Truyền lambda đến std :: function with parameter package
#include <functional>
template <typename TReturn, typename ... TArgs>
void Functor(std::function<TReturn (TArgs...)> f) {}
int main(int argc, char * argv[]) {
auto x = [] (int a, int b) { return a * b; };
Functor<int, int, int>(x);
return 0;
}
Mã trên không biên dịch vì không khấu trừ loại. Rõ ràng gõ x
là std::function<int (int, int)>
thay vì sử dụng auto
làm cho lỗi biến mất. Nhưng điều đó không cho phép tôi chuyển giá trị r vào Functor
như tôi muốn. Tôi cũng không muốn loại bỏ bất kỳ loại an toàn nào bằng cách sử dụng một tham số mẫu khác cho loại hàm.
Những gì tôi thực sự không hiểu là tại sao mã trên thất bại trong việc biên dịch, nhưng mã dưới đây là tốt và hoạt động:
#include <functional>
template <typename TReturn, typename TArgA, typename TArgB>
void Functor(std::function<TReturn (TArgA, TArgB)> f) {}
int main(int argc, char * argv[]) {
auto x = [] (int a, int b) { return a * b; };
Functor<int, int, int> (x);
return 0;
}