Ký hiệu cho std :: function khá đẹp khi so sánh với con trỏ hàm. Tuy nhiên, ngoài ra, tôi không thể tìm thấy một trường hợp sử dụng mà nó không thể được thay thế bằng con trỏ. Vì vậy, nó chỉ là cú pháp đường cho con trỏ chức năng?Có một trường hợp sử dụng cho std :: chức năng mà không được bao phủ bởi con trỏ chức năng, hoặc là nó chỉ cú pháp đường?
Trả lời
std::function<>
mang đến cho bạn khả năng đóng gói mọi loại đối tưởng callable, đó là gợi ý một cái gì đó chức năng không thể làm (mặc dù nó là sự thật rằng phi chụp lambdas có thể được chuyển đổi sang hoạt động con trỏ).
Để cung cấp cho bạn một ý tưởng về các loại linh hoạt nó cho phép bạn đạt được:
#include <functional>
#include <iostream>
#include <vector>
// A functor... (could even have state!)
struct X
{
void operator()() { std::cout << "Functor!" << std::endl; }
};
// A regular function...
void bar()
{
std::cout << "Function" << std::endl;
}
// A regular function with one argument that will be bound...
void foo(int x)
{
std::cout << "Bound Function " << x << "!" << std::endl;
}
int main()
{
// Heterogenous collection of callable objects
std::vector<std::function<void()>> functions;
// Fill in the container...
functions.push_back(X());
functions.push_back(bar);
functions.push_back(std::bind(foo, 42));
// And a add a lambda defined in-place as well...
functions.push_back([]() { std::cout << "Lambda!" << std::endl; });
// Now call them all!
for (auto& f : functions)
{
f(); // Same interface for all kinds of callable object...
}
}
Như thường lệ, thấy một live example here. Trong số những thứ khác, điều này cho phép bạn nhận ra số Command Pattern.
Cảm ơn rất nhiều, ví dụ của bạn rất có ý nghĩa. –
@static_rtti: OK, vui vì nó đã giúp :) –
tại sao bạn không được phép giải thích về các chức năng thông thường? (Đó là người duy nhất mất tích '!') :-P –
std::function
được thiết kế để thể hiện bất kỳ loại đối tượng có thể gọi nào. Có rất nhiều đối tượng có thể gọi được mà không thể được biểu diễn bằng bất kỳ cách nào bởi một con trỏ hàm.
Một functor:
struct foo { bool operator()(int x) { return x > 5; } }; bool (*f1)(int) = foo(); // Error std::function<bool(int)> f2 = foo(); // Okay
Bạn không thể tạo một thể hiện của
foo
và lưu nó trong một con trỏbool(*)(int)
chức năng.Một lambda với một lambda-chụp:
bool (*f1)(int) = [&](int x) { return x > y; }; // Error std::function<bool(int)> f2 = [&](int x) { return x > y; }; // Okay
Tuy nhiên, một lambda không có chụp có thể được chuyển đổi sang một con trỏ hàm:
Kiểu đóng cửa cho một lambda- biểu thức không có lambda-capture có một hàm chuyển đổi const không rõ ràng công khai cho con trỏ tới hàm có cùng tham số và kiểu trả về như toán tử gọi hàm của kiểu đóng. Giá trị trả về bởi hàm chuyển đổi này sẽ là địa chỉ của hàm mà khi được gọi, có cùng tác dụng như gọi toán tử gọi hàm của loại đóng.
thực hiện xác định giá trị có thể được gọi trở lại:
bool foo(int x, int y) { return x > y; }; bool (*f1)(int) = std::bind(&foo, std::placeholders::_1, 5); // Error (probably) std::function<bool(int)> f2 = std::bind(&foo, std::placeholders::_1, 5); // Okay
std::bind
's giá trị trả về là một đối tượng có thể được gọi thực hiện xác định. Chỉ cách đối tượng đó có thể được sử dụng được quy định bởi tiêu chuẩn, không phải kiểu của nó.
- 1. chức năng 'hợp lệ' std :: là gì?
- 2. Con trỏ của một số chức năng
- 3. Ghim con trỏ chức năng
- 4. con trỏ trỏ đến chức năng gán
- 5. C# con trỏ chức năng?
- 6. Lưu trữ con trỏ hàm trong std :: chức năng
- 7. Gọi chức năng Clojure sử dụng var-quote cú pháp
- 8. Xác định các con trỏ chức năng
- 9. Bạn có sử dụng Python chủ yếu cho các chức năng hướng đối tượng hoặc chức năng của nó không?
- 10. Sử dụng các con trỏ chức năng xa
- 11. Thông số chức năng: Sao chép hoặc con trỏ?
- 12. Chức năng truyền con trỏ trong C++
- 13. C++, chức năng con trỏ đến con trỏ mẫu chức năng
- 14. Gọi một khoảng trống * làm chức năng mà không cần khai báo con trỏ hàm
- 15. mảng của N con trỏ đến chức năng trở về con trỏ đến chức năng
- 16. Chức năng chuyển đổi theo khuôn mẫu thành con trỏ chức năng
- 17. Con trỏ chức năng với GCC, gán địa chỉ
- 18. C++ Gọi con trỏ tới chức năng thành viên
- 19. Chức năng không thay đổi con trỏ thông qua C++
- 20. chức năng ngay cú pháp gọi
- 21. Có hỗ trợ opencl Chức năng Con trỏ không?
- 22. Có thể std :: chức năng được serialized?
- 23. Reference đến Chức năng cú pháp - có và không có &
- 24. Con trỏ chức năng chung trong C
- 25. Gọi std :: chức năng trong một std :: for_each
- 26. C++ 11 lambdas đến Con trỏ Chức năng
- 27. Chức năng và cú pháp giữ chỗ
- 28. Matlab - Kiểm tra xem chức năng xử lý là một chức năng hoặc chức năng cụ thể
- 29. Tại sao tôi có thể thực hiện cuộc gọi chức năng sử dụng một lớp không hợp lệ con trỏ
- 30. Có thể đo độ bao phủ chức năng bằng gcov không?
Bất kỳ đối tượng nào có thể gọi không phải là chức năng? Functors stateful, lambdas, ràng buộc biểu thức ...? –
std :: function là cú pháp đường cho tất cả các loại functors, không chỉ là con trỏ hàm. – nurettin
@Xeo: câu trả lời trong câu hỏi này tốt hơn nhiều. –