2015-11-07 15 views
10

Có cách nào để áp dụng một mệnh đề yêu cầu chung cho các đối số của một hàm lambda?Làm thế nào để sử dụng mệnh đề require với đối số lambda functor?

Giả sử tôi có hai ràng buộc C1C2 mà tôi muốn kiểm tra đối số. Tôi đã có thể dự kiến ​​như sau để làm việc kể từ một cú pháp tương tự được phép cho các chức năng:

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> { 
    // ... 
} 

Nhưng won't compile này với GCC 6

+0

Tại sao bạn không chỉ cần viết một functor bình thường không? – inf

+4

Các khái niệm TS không sửa đổi ngữ pháp cho lambdas, vì vậy tôi nghĩ rằng không thể thêm mệnh đề yêu cầu vào một lambda. Bằng cách thay đổi định nghĩa của * simple-type-specifier *, nó cho phép sử dụng các kiểu-specifier-constrained như các tham số. – dyp

Trả lời

5

Trong thiển ý của tôi và dựa trên Concepts TS§5.1.4/c4 Yêu cầu biểu thức [expr.prim.req] (Mine Nhấn mạnh):

một đòi hỏi thể hiện trách nhiệm chỉ xuất hiện trong vòng một khái niệm defin ition (7.1.7), hoặc trong điều khoản yêu cầu của một tờ khai mẫu (Điều 14) hoặc khai báo hàm (8.3.5).

Trích dẫn trên chỉ rõ các ngữ cảnh trong đó mệnh đề requires có thể xuất hiện và lambdas không phải là một trong số chúng.

Concequently,

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> { 
    // ... 
} 

là không hợp lệ.

Tuy nhiên, trong §5.1.2 biểu thức Lambda [expr.prim.lambda] có ví dụ sau:

template<typename T> concept bool C = true; 
auto gl = [](C& a, C* b) { a = *b; }; // OK: denotes a generic lambda 

Vì vậy, tôi đoán, bạn có thể thực hiện những gì bạn muốn theo cách sau đây:

template <class T> concept bool C1 = true;           
template <class T> concept bool C2 = true; 
template <class T> concept bool C3 = C1<T> && C2<T>; // Define a concept that combines 
                // `C1` and `C2` requirements.     

int main() {                  
    auto f = [](C3 x) { /* Do what ever */ }; // OK generic lambda that requires input 
              // argument satisfy `C1` and `C2`                               
} 

Live Demo

+0

Vâng, có vẻ như đó là sự thật. Tôi đã tìm thấy chuỗi này trên nhóm khái niệm đề cập đến cùng một [câu hỏi] (https://groups.google.com/a/isocpp.org/forum/?fromgroups#!topic/concepts/4WraUOsevH8). Thật không may vì có rất nhiều trường hợp mà cú pháp khái niệm ngắn gọn không đủ để thể hiện ràng buộc cần thiết. Hy vọng rằng, điều này sẽ được giải quyết trong một dự thảo trong tương lai. – rnickb

+0

Quyền - Tôi biết cú pháp khái niệm ngắn gọn. Tuy nhiên, IMO là một khiếm khuyết mà bạn sẽ phải định nghĩa một khái niệm hoàn toàn mới nếu bạn có một mệnh đề đòi hỏi phức tạp hơn. Hơn nữa, cú pháp đó sẽ không hoạt động nếu bạn có một khái niệm cần tham chiếu nhiều đối số. – rnickb

+0

@rnickb dựa trên liên kết bạn đăng nó không có trong danh sách ưu tiên của Adrew Shutton "Làm cho lambdas lớn hơn không cao trong danh sách các ưu tiên của chúng tôi (lambdas được cho là viết mã ngắn hơn)." Tôi đồng ý với điều đó. Lambdas thực sự phải viết mã ngắn hơn. Mặt khác những gì bạn đang nói là đúng, thành phần của các khái niệm để thực hiện những gì bạn muốn, kinda obfuscates mã cơ sở. Tôi đoán chúng ta sẽ thấy trong tương lai những gì sẽ xảy ra :). – 101010

Các vấn đề liên quan