2017-01-02 22 views
7

Tôi sử dụng C++ 11 trong khi tôi cần một số lớp từ thư viện C++ 17. Khi sử dụng tăng cường mà từ đó các lớp học được thêm vào, tôi muốn làm như sau:Bí danh không gian tên trong C++

#if __cplusplus < CPP17 
using std::any = boost::any; 
#endif 

Bí danh này không được phép. Đồng thời mở rộng không gian tên std sẽ gây ra undefined behaviour. Tôi muốn mã của tôi để tìm cùng một khía cạnh của phiên bản C++. Có cách nào rõ ràng không?

+5

Chỉ cần sử dụng tên của riêng bạn và gán 'boost :: any' hoặc' std :: any' cho nó khi cần thiết? –

Trả lời

6

Cách rõ ràng là thêm tên tùy chỉnh cho nó.

#if __cplusplus < CPP17 
using my_any = boost::any; 
#else 
using my_any = std::any;  
#endif 

// using my_any... 
+0

Tôi whish để sử dụng std :: bất kỳ cho C++ 17 khả năng tương thích. – Ariel

+1

@Ariel Khi bạn nhận ra, không thể "sửa đổi" không gian tên std một cách hợp pháp. – songyuanyao

6

Có vẻ như bạn đang cố gắng tạo bí danh loại trong một không gian tên. Cú pháp corect cho điều đó là:

namespace namespace_name { 
    using any = boost::any; 
} 

định nghĩa Tuy nhiên, tiêu chuẩn không cho phép thêm (có những ngoại lệ cho mẫu chuyên ngành) vào std namespace, vì vậy nếu bạn đã cố gắng để xác định std::any, hành vi của chương trình của bạn sẽ được xác định.

Sử dụng bất kỳ không gian tên nào, bao gồm cả không gian tên chung, nhưng không phải là tên miền được dành riêng cho việc triển khai, bao gồm std và tên phụ của nó.

+0

Tôi đã cố thêm các định nghĩa trong không gian tên std và nó đã được biên dịch. – Ariel

+3

@Ariel Tôi đã sửa đổi câu trả lời của mình. Các định nghĩa trong 'std' không làm cho chương trình không đúng định dạng, nó làm cho hành vi không xác định. Điều đó nói rằng, bị hình thành không được bảo đảm để ngăn chặn chương trình biên dịch. – user2079303

+0

Thật đáng buồn khi tôi chuyển từ phiên bản cũ sang phiên bản C++ sang phiên bản mới, tôi phải thay đổi tất cả 'tăng' trong 'std'. – Ariel

0

Tôi không thấy vấn đề lớn với những lo lắng về hành vi không xác định. Bạn sử dụng một #if để kiểm tra C++ 17, và bạn biết không có any trước đó. Nếu bạn thực sự muốn điều này, tôi nói đi cho nó, và đặt bí danh trong std nếu nó sớm hơn C++ 17.

Vào cuối ngày, các hàm/lớp trợ giúp/etc có thể sẽ được đặt trong một không gian tên khác hoặc bắt đầu bằng __ vì nó có sẵn cho các thư viện chuẩn. Tôi không nghĩ rằng bất kỳ thực hiện trước C++ 17 xuất khẩu any trong std.

Không còn cách nào khác. Chỉ cần bỏ qua "hành vi không xác định" và đi cho nó nếu nó hoạt động. Không có gì huyền diệu về nó làm hỏng mã của bạn; điều tồi tệ nhất có thể xảy ra là việc triển khai std xấu sẽ xung đột và không thể biên dịch khi bạn xác định bí danh. Một số người thổi phồng các vấn đề hành vi không xác định theo ý kiến ​​của tôi.

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