Tôi không chắc rằng tiêu đề của câu hỏi là đúng. Đây là vấn đề. Tôi đang viết một thư viện sử dụng một số tính năng thư viện C++ 11. Rõ ràng không phải tất cả các triển khai đều hỗ trợ các thư viện này và do đó có vấn đề về tính di động. Không quan trọng thư viện nào quan tâm ở đây. Một giải pháp là sử dụng boost, đã cung cấp rất nhiều thư viện C++ 11. Vì vậy, giải pháp của tôi là xác định macro, nói USE_CXX11
và xác định không gian tên mới nói internal
và giới thiệu tên vào không gian tên bên trong này phụ thuộc vào các macro. Ví dụ: tôi cần sử dụng tên foo
từ thư viện C++ <foo>
, cũng có sẵn trong <boost/foo/foo.hpp>
. Những gì tôi làm làTrình bao bọc C++ để tăng/C++ 11
#ifdef USE_CXX11
#include <foo>
#else
#include <boost/foo/foo.hpp>
#endif
namespace internal {
#ifdef USE_CXX11
using std::foo;
#else
using boost::foo::foo;
#endif
}
Và trong thư viện còn lại, tôi chỉ sử dụng internal::foo
. Mã của bên thứ ba sử dụng thư viện này có thể xác định macro thích hợp để cho biết liệu chúng có thực thi C++ 11 hoạt động hay không hoặc chúng chỉ có thể sử dụng tăng. Và thư viện của tôi sẽ lấy tiêu đề và không gian tên phù hợp. Điều này hoạt động cho đến nay. Hy vọng tôi đã giải thích ý định của tôi tốt.
Nhưng các giải pháp trên dường như rất xấu đối với tôi. Có cách nào tốt hơn cho loại điều này không? Hoặc có bất kỳ tình huống có thể nào mà cách tiếp cận này sẽ không hoạt động?
Check-out ** Boost.TR1 ** –
Nếu đó là trong Boost, và bạn cần phải hỗ trợ các trình biên dịch đã lỗi thời, chỉ cần sử dụng trình biên dịch trong Boost trực tiếp. –
Tại sao không chỉ sử dụng tăng? – fbafelipe