2016-03-08 16 views
5

Trong khi thực hiệnstd::experimental::optional (cppreference.com) tôi đã nhầm lẫn bởi các đặc điểm kỹ thuật của một nhà xây dựng cụ thể, cụ thể là:std :: nghiệm :: tùy chọn <T> thực hiện: Constexpr constructor nhầm lẫn

constexpr optional(const T& value); // (4) 

(Source)

Công cụ xây dựng này cho phép optional<T>, cho loại có thể bị phá hủy tầm thường T, được xây dựng theo ngữ cảnh constexpr. Trong khi yêu cầu đầu tiên, cụ thể là tắt chức năng destructor do người dùng cung cấp trong trường hợp này để làm cho optional<T> một loại chữ, thẳng về phía trước để giải quyết, tôi không biết cách để tránh giới hạn vị trí mới không được phép trong constexpr .

Tôi nghĩ mình phải triển khai optional<T> sử dụng std::aligned_storage<T> để cho phép các loại T không được định cấu hình mặc định và đáp ứng mọi yêu cầu căn chỉnh, nếu có. Nhưng như tôi đã nói, constexpr cấm tôi sử dụng vị trí mới trong hàm tạo cụ thể đó.

Tôi có phải uống nhiều cà phê và không thấy giải pháp rõ ràng ở đây không?

Cảm ơn bạn

+0

Bản sao có thể có của [Làm thế nào nên sử dụng std :: optional?] (Http://stackoverflow.com/questions/16860960/how-should-one- sử dụng-stdoptional) – Matriac

+2

@Matriac đây là câu hỏi về phía thực hiện. – nshct

+1

Một 'union' có thể làm việc cho constructor cụ thể này, nhưng tôi không tự tin nó sẽ đủ để xử lý tất cả các trường hợp. – hvd

Trả lời

4

Tôi không biết làm thế nào để có được xung quanh hạn chế theo vị trí mới không được phép trong constexpr.

Đó là một loại chẩn đoán chính xác, theo nghĩa đen, constexpr và các cụm từ mới không pha trộn. Cách đơn giản nhất để thực hiện các yêu cầu khác nhau của std::experimental::optional<T> là triển khai nó với các thành viên biến thể. Nói một cách rõ ràng, một số union phải được tham gia vào một thời điểm nào đó. Một phác thảo nhanh chóng:

template<typename Val> 
struct optional { 
    union { 
     Val optional_value; 
     unsigned char dummy_byte; 
    }; 
    bool filled; 

    // post-condition: no-value state 
    constexpr optional() 
     : dummy_byte {} 
     , filled(false) 
    {} 

    // post-condition: has-value state 
    constexpr optional(Val const& val) 
     : optional_value(val) 
     , filled(true) 
    {} 

    // other special members omitted for brevity 
}; 

Live On Coliru

Như một vấn đề của thực tế, series cũ của optional đề xuất sử dụng để have a paragraph on the technique để chứng minh rằng các yêu cầu nó đưa ra là hợp lý chút nào. (Ngày nay, std::experimental::optional tồn tại trong các TSs ứng dụng cơ bản của Thư viện khác nhau.)

+0

Cảm ơn bạn. Tôi không biết tại sao tôi lại tập trung vào alignment_storage, nhưng đây là giải pháp đúng. – nshct