Trong trường hợp đặc biệt này, bạn chỉ có thể xác định đóng cửa rỗng của bạn là một trong đó luôn luôn trả -1
:
template <typename Lambda>
int foo(Lambda bar) {
return bar(3);
}
#include <iostream>
int main() {
auto const NULL_LAMBDA = [](int){ return -1; };
std::cout << foo([](int a) {return a + 3;}) << std::endl;
std::cout << foo(NULL_LAMBDA) << std::endl;
}
Khả năng là nếu bạn đang chọn tại thời gian chạy việc triển khai nào cần thực hiện, sau đó bạn nên loại bỏ nó tốt hơn bằng cách std::function
thay vì tạo mẫu. Và std::function
được phép là trống - nó có thể được gán và so sánh với một con trỏ rỗng.
Nếu bạn biết lúc biên soạn rằng một số trang web gọi sẽ luôn vượt qua lambda 'null', sau đó bạn có thể chuyên thực hiện một cách thích hợp. Các tùy chọn rõ ràng bao gồm quá tải foo()
với phiên bản không tham số bar
hoặc chuyên môn với triển khai khác khi bar
không phải là một cuộc gọi.
Nếu nhiều số foo()
là phổ biến cho cả hai loại lời gọi (có thể có nhiều tác dụng phụ, và bar()
được cung cấp dưới dạng gọi lại?), Thì bạn có thể điều kiện phần tùy chọn bằng cách sử dụng std::is_same<>
. Điều này đòi hỏi if constexpr
, như lambda là không thể được gọi là bar(3)
:
static auto const NULL_LAMBDA = nullptr;
#include <type_traits>
template <typename Lambda>
int foo(Lambda bar) {
if constexpr (std::is_same<decltype(bar), std::nullptr_t>::value)
return -1;
else
return bar(3);
}
#include <iostream>
int main() {
std::cout << foo([](int a) {return a + 3;}) << std::endl;
std::cout << foo(NULL_LAMBDA) << std::endl;
}
Nguồn
2017-08-17 08:45:29
Ý anh là gì bởi "lambda null"? – melpomene
Bạn có thể sử dụng 'std :: optional' hoặc tương đương từ một thư viện khác không? – KABoissonneault