2014-04-04 16 views
6

Herb Sutters đã đề cập đến các mẫu bị ràng buộc (a.k.a. Các khái niệm Lite) trong bài nói chuyện: Modern C++: What You Need to Know.Mẫu bị hạn chế là gì?

Tôi biết rằng tăng có gói khái niệm ở mọi lứa tuổi, cho phép một thông báo lỗi in đẹp, khi cơ chế khấu trừ mẫu không tìm thấy toán tử, chức năng hoặc có mẫu vi phạm truy cập.

Tôi đã gặp phải các đề cập trên số isocpp blog rằng đã có chi nhánh thử nghiệm là gcc triển khai document proposing Concepts Lite. Tuy nhiên, nhìn qua C++14 draft hiện tại, tôi không thể tìm thấy bất kỳ gợi ý nào cho dù điều này sẽ là một phần của C++14.

Vì vậy, những câu hỏi rất đơn giản:

  • sẽ Concepts Lite là một phần của C++ 14? (Tham khảo trong tiêu chuẩn ưa thích. Tôi không thể tìm thấy một, và tôi không phải là rất quen thuộc với các tiêu chuẩn.)
  • cú pháp chính xác của nó là gì? (Đề xuất và trang trình bày của Herb phân tán ở đây và tôi không biết cái nào được cập nhật nhiều hơn)
  • bạn có thể đưa ra một ví dụ tối thiểu về ràng buộc (biến vị ngữ) và một mẫu bị ràng buộc không?

LƯU Ý: nếu bạn chờ đợi đủ lâu tôi sẽ cố gắng để có được những gcc chi nhánh hoạt động và ít nhất có thể nói bất cứ điều gì về việc thực hiện thí điểm, trong đó tuy nhiên không bao hàm tính chính xác của cú pháp.

+0

* Liệu khái niệm Lite có phải là một phần của C++ 14 không? (Tham khảo trong tiêu chuẩn được ưa thích * Cái gì? Không có chuẩn C++ 14 nào cả. Dù sao, không, chúng sẽ không ở trong C++ 14. Tôi sẽ cố gắng tìm một số tham khảo/thảo luận .. – dyp

+2

[Đề nghị] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3580.pdf) giải thích khá tốt, không phải là làm cho câu hỏi này trở nên bất hợp pháp, không phải ai cũng muốn đọc 30 trang. – David

+3

[Stroustrup nói trên trang chủ của anh ấy] (http://www.stroustrup.com/C++11FAQ.html#what-concepts) rằng chúng sẽ kết thúc dưới dạng TR tới C++ 14. Không chắc chắn cách thức up- – dyp

Trả lời

3

Các khái niệm Lite là "hạn chế" một phần của thiết kế khái niệm đầy đủ cho C++. Nó được mô tả chi tiết trong N3701 "Concepts Lite". Chương 2 là một hướng dẫn ngắn nhanh chóng chạy qua các nguyên tắc cốt lõi và ứng dụng của chúng, điều này rất tuyệt vời cho những người không muốn đọc qua tất cả 56 trang.

Các khái niệm Lite sẽ không trở thành một phần của C++ 14, nó sẽ được phát hành như một số kỹ thuật riêng biệt vào cuối năm nay. Bản thảo thô mới nhất cho từ ngữ TS là N3929 "Concepts Lite Specification".

Có một vài biến thể cú pháp ràng buộc khác nhau. Đoạn mã ví dụ rằng Herb sử dụng trong cuộc nói chuyện:

auto mean(const Sequence& seq) { 
    auto n = 0.0; 
    for (auto x : seq) 
    n += x; 
    return n/seq.size(); 
} 

được gọi là "cú pháp ngắn gọn" vì đó là một tương đương ngắn hơn của cú pháp tiết:

template <typename __T> 
    requires Sequence<__T>() 
auto mean(const __T& seq) { 
    auto n = 0.0; 
    for (auto x : seq) 
    n += x; 
    return n/seq.size(); 
} 

Cả hai đều chỉ ra rằng hàm mẫu mean có thể được khởi tạo với bất kỳ kiểu nào mô hình hóa khái niệm Sequence. Để đơn giản, giả sử rằng các yêu cầu đối với Sequence chỉ là những gì chúng tôi thực hiện mean cần: (a) thành viên begin & end trả về bộ lặp và (b) chức năng thành viên size. Chúng ta có thể định nghĩa khái niệm như:

template <typename T> 
concept bool Sequence() { 
    return requires(T t) { 
    {t.size()} -> Integral; 
    {t.begin()} -> InputIterator; 
    {t.end()} -> InputIterator; 
    requires Same<decltype(t.begin()), decltype(t.end())>(); 
    } 
} 

giả định nghĩa thẳng về phía trước của Integral, InputIterator, và Same.định nghĩa khái niệm này đảm bảo rằng, đối với một số giá trị phát minh t loại T đang được thử nghiệm:

  • t.size() là một biểu thức hợp lệ, và nó trả về một loại rằng các mô hình khái niệm Integral.
  • t.begin() hợp lệ và trả về loại mô hình InputIterator.
  • Tương tự cho t.end().
  • Số InputIterator được trả lại bởi t.begin() có cùng loại như được trả về bởi t.end().
Các vấn đề liên quan