Tôi hiện đang thực hiện một số bài tập có chức năng khuôn mẫu. Tôi có nhiệm vụ viết một thuật toán chuyển đổi. tôi đã làm nó như sau và nó hoạt động:lambda với các mẫu
template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
while (b != e)
*d++ = p(*b++);
return d;
}
Như với bình thường chuyển đổi tôi phải gọi vị với một loại rõ ràng như
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
Bây giờ, tôi stumbled khi C++ 11 Lambdas và muốn gọi chức năng của tôi như thế này:
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;});
Với điều đó tôi nhận được lỗi trình biên dịch mà loại không thể suy luận được. Đây là điều tôi không hiểu vì tôi đang xác định loại T trong lambda của tôi thực sự hai lần.
Tôi cũng đã kiểm tra lại chức năng biến đổi ban đầu, mà nó đang hoạt động. Sau đó tôi đã kiểm tra implementation của cái đó và nó rõ ràng được triển khai với một lớp mẫu cho toàn bộ hàm. Đó có phải là cách chính xác để triển khai các biến vị ngữ với các mẫu không?
Tôi đã nghĩ như vậy sau khi đọc triển khai biến đổi, điều đó cũng giúp bạn dễ dàng hơn rất nhiều. Tôi vẫn tự hỏi tại sao tôi không làm việc trong trường hợp khác. – inf
@ bamboon Tôi đoán vì lambda không có chức năng nhưng là một đối tượng hàm, vì nó cũng có thể giữ trạng thái (nó là một đóng và không chỉ là một hàm). –
Lưu ý rằng một lambda mà không thực hiện bất kỳ bắt được chuyển đổi thành một hàm bình thường (con trỏ). – spraff