1. Có x(123)
thực sự gọi số operator()
của functor mà std::function
được tạo mà lần lượt gọi số operator()
của functor mà std::bind
tạo ra cuối cùng gọi là func
? Điều này có được tối ưu hóa thành thứ gì đó tối ưu như gọi số func(123)
không?
Nếu bạn đã bật tối ưu hóa, 'nội dung' được nội tuyến và bạn có thể dựa vào điều này là tối ưu như gọi func(123)
.
2. Functor sống ở đâu mà std::bind
tạo ra? Trong phạm vi nào? Và làm thế nào để std::bind
đặt tên? (có thể có sự va chạm tên)
Precising: bind
tạo biểu thức ràng buộc, thực hiện được xác định, ràng buộc, có thể gán cho function<>
. Chức năng chỉ là một mẫu lớp (Cảm ơn, Luc T.). Và nó sống trong thư viện chuẩn. Tuy nhiên, các biểu thức ràng buộc được thực hiện xác định.
Thư viện chuẩn không đi kèm với các đặc điểm (std::is_bind_expression<>
) để cho phép phát hiện MPL các biểu thức như vậy. Một tính năng quyết định của các biểu thức kết buộc trên std :: function là chúng là (những gì tôi gọi) các đối tượng có thể gọi được (tức là chúng giữ nguyên ngữ nghĩa của trang gọi bao gồm khả năng chọn quá tải tại trang ứng dụng thực tế). Mặt khác, std::function<>
cam kết với một nguyên mẫu đơn lẻ và lưu trữ nội bộ callable object theo kiểu xóa (nghĩ variant
hoặc any
).
3. Lambdas có thể thay thế tất cả các công dụng của std :: bind?
4. Là std :: ràng buộc tối ưu như thực hiện nó như là một lambda thay thế?
AFAICT lambdas nên biên dịch về tương tự như biểu thức ràng buộc. Một điều mà tôi nghĩ lambdas không thể làm điều đó biểu thức ràng buộc thể là nested bind expressions
Sửa Trong khi thành ngữ cụ thể của biểu thức ràng buộc lồng nhau được không replicatable sử dụng lambdas, lambdas là tất nhiên có thể thể hiện (gần) cùng nhiều tự nhiên hơn:
bind(f, bind(g, _1))(x);
// vs.
[](int x) { f(g(x)); };
5. Có gì với cú pháp của đối số mẫu là std::function
? Làm thế nào để có được phân tích cú pháp và làm thế nào tôi có thể sử dụng cú pháp đối số khuôn mẫu đó ở nơi khác?
Nó chỉ là chữ ký hàm (loại của hàm), được chuyển làm tham số mẫu.
Bạn cũng có thể sử dụng nó làm kiểu tham số chức năng, làm giảm thành con trỏ hàm (tương tự như cách tham số mảng theo giá trị phân tách thành con trỏ, Cảm ơn David!). Trên thực tế, bất cứ nơi nào nhất, miễn là bạn không có nhu cầu tên một biến/loại:
void receiveFunction(void(int, double)); // spunky 'function<>'-style syntax
void sample(int, double) { }
int main()
{
receiveFunction(sample);
}
void receiveFunction(void (*f)(int, double)) // boring 'old' style syntax
// void (f)(int, double) // ... also ok
{
// ..
}
Đối với 2. bạn có thể quan tâm đến http://www.artima.com/cppsource/type_erasure.html – Flexo
Một câu hỏi tại một thời điểm, vui lòng. Mỗi bài SO là một câu hỏi. –
Đây là một tập hợp các câu hỏi hơn là một câu hỏi cụ thể, và chúng nằm trong phạm vi từ cú pháp (đối số 'hàm <>') đến hành vi (kết quả của ràng buộc trực tiếp? Lambda có thể thay thế chúng?) nó được tối ưu hóa?) –