Tôi có một câu hỏi liên quan đến C++ 0x lambdas. Trong mã của tôi, nó sẽ có ích khi biết liệu một kiểu đã cho là kiểu của một biểu thức lambda C++ 0x. Để đưa ra ví dụ:Là một đặc tính C++ is_lambda, hoàn toàn được thực hiện như một thư viện, không thể?
struct foobar
{
void operator()()
{
}
};
auto lambda = []{};
typedef is_lambda < decltype(lambda) > ::type T; // T would be a true_type
typedef is_lambda <foobar> ::type T; // T would be a false_type
Khá dễ dàng để phân biệt biểu thức lambda từ chức năng và loại hàm thành viên. Functors là một vấn đề khác.
Vấn đề tôi thấy ở đây là định nghĩa biểu thức lambda theo chuẩn C++ 0x sắp tới; điều duy nhất phải được xác định là một nhà điều hành cuộc gọi công cộng. Tuy nhiên, điều này cũng đúng đối với một functor; kiểm tra sự hiện diện của toán tử cuộc gọi là không đủ để phân biệt các biểu thức lambda từ các hàm. Hơn nữa, nếu toán tử functor là không phải là, lỗi trình biên dịch sẽ xảy ra, vì SFINAE không áp dụng. Khi nào điều này xảy ra? Toán tử cuộc gọi của functor có thể được tạo khuôn mẫu. Vì vậy, một mã số ví dụ:
typedef decltype(&T::operator()) call_type;
sẽ làm việc cho cả hai biểu thức lambda và functors với nhà điều hành cuộc gọi không templated, và tạo ra một lỗi biên dịch cho các nhà khai thác cuộc gọi templated.
Tôi tin rằng một đặc điểm is_lambda < >
chỉ có thể được tạo bằng các tính năng trình biên dịch nội tại. Bạn có thấy một cách để thực hiện đặc điểm này?
Tôi tự hỏi bạn sẽ sử dụng nó để làm gì? –
Xin lỗi vì trả lời muộn. Có, tôi nghĩ rằng tôi đã thực hiện một lỗi hợp lý. Không có điểm nào trong việc phân biệt các functors thông thường từ lambdas - tôi có thể xem cái sau là cái cũ. Tuy nhiên, cần phải xác định liệu một toán tử cuộc gọi có tồn tại hay không. Đến ngày này, không có giải pháp hoàn toàn chung cho vấn đề này dường như tồn tại. Tôi sẽ sớm giải quyết vấn đề này trong một câu hỏi riêng, cùng với những nỗ lực của tôi. –
@MaximYegorushkin: Đối với một sự khác biệt thúc đẩy: loại của một * đối tượng đóng cửa * nhận dạng duy nhất nó thực hiện. Điều tương tự cũng không nhất thiết là đúng đối với các con trỏ hàm khác hoặc hàm khác như đối tượng. – BCS