2012-06-04 34 views
8

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?

+1

Check-out ** Boost.TR1 ** –

+3

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. –

+0

Tại sao không chỉ sử dụng tăng? – fbafelipe

Trả lời

5

Giải pháp của bạn có vẻ ổn với tôi; vấn đề duy nhất sẽ là (như Chet đề cập) trong trường hợp các giao diện và/hoặc triển khai Boost và C++ 11 khác nhau.

Trong thực tế, tôi làm điều đó trong thư viện Boost.Algorithms (mới trong phiên bản 1.50 sắp tới)

namespace boost { namespace algorithm { 
#if __cplusplus >= 201103L 
using std::find_if_not;  // Section 25.2.5 
#else 
template<typename InputIterator, typename Predicate> 
InputIterator find_if_not (InputIterator first, InputIterator last, Predicate p) 
{ 
    for (; first != last; ++first) 
     if (!p(*first)) 
      break; 
    return first; 
} 
#endif 
}} 
2

Tôi không thấy đây là giải pháp khả thi. Điều kiện chuyển đổi giữa các lớp sẽ hạn chế việc sử dụng chúng chỉ với các hàm thành viên có cùng chữ ký và ngữ nghĩa. Bạn cũng đang chuyển hướng truy cập vào Thư viện chuẩn mà có thể cảm thấy không tự nhiên đối với nhiều nhà phát triển.

Nếu khả năng sử dụng là mối quan tâm giữa C++ 03 và C++ 11 thì bạn chắc chắn nên sử dụng Boost cho mọi thứ. Nếu C++ 11 là mục tiêu duy nhất của bạn, bạn có thể có thành công tốt hơn khi đánh giá các trình biên dịch khác nhau để xem các tính năng ngôn ngữ và thư viện nào họ hỗ trợ. Chọn những người được hỗ trợ tốt và được coi là lỗi miễn phí. Đối với mọi thứ khác sử dụng Boost và refactor sau này nếu cần thiết để hỗ trợ thêm các tính năng thư viện C++ 11. Bạn sẽ được tốt hơn nhiều bằng cách sử dụng các thư viện song song hơn là chuyển đổi giữa chúng.

Bạn có thể bắt đầu với trang trạng thái của GCC's C++ Standard Library implementation.

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