2012-06-04 94 views
8

我不確定問題的標題是否正確。這是問題。我正在編寫一個使用一些C++ 11庫特性的庫。顯然不是所有的實現都支持這些庫,因此存在可移植性問題。這裏關心哪個庫是無關緊要的。一種解決方案是使用boost,它已經提供了很多C++ 11庫。所以我的解決方案是定義一個宏,如USE_CXX11,並定義一個新的名稱空間,如internal,並根據宏將名稱引入此內部名稱空間。例如,我需要使用來自C++庫<foo>的名稱foo,該名稱也可在<boost/foo/foo.hpp>中獲得。我所做的是boost/C++的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 
} 

而在圖書館的其餘部分,我只使用internal::foo。使用該庫的第三方代碼可以定義適當的宏來指示它們是否具有正常工作的C++ 11實現,或者它們只能使用boost。而我的圖書館將拾取正確的標題和名稱空間。這工作到目前爲止。希望我已經很好地解釋了我的意圖。

但上述解決方案對我來說似乎非常難看。這種事情有沒有更好的做法?或者有什麼可能的情況下,這種方法將無法正常工作?

+1

退房** ** Boost.TR1如果 –

+3

它在加速,你需要支持過時的編譯器,直接使用Boost中的那個。 –

+0

爲什麼不直接使用boost? – fbafelipe

回答

5

您的解決方案對我來說看起來很好;在Boost和C++ 11接口和/或實現不同的情況下,唯一的問題是(如Chet提到的)。

其實,我做的是,在Boost.Algorithms庫(在即將到來的1.50版本新)

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

我不認爲這是一個可行的解決方案。有條件地在類之間切換將限制它們的使用僅限於那些具有相同簽名和語義的成員函數。您還將重定向訪問標準庫,這對許多開發人員來說可能會感覺不自然。

如果可用性是C++ 03和C++ 11之間的一個問題,那麼您絕對應該使用Boost來處理所有事情。如果C++ 11是您唯一的目標,您可以更好地評估各種編譯器,以查看它們支持的語言和庫功能。選擇那些支持良好並且認爲無bug的。對於其他所有內容,如果需要使用Boost和稍後重構以支持更多C++ 11庫功能。你將會更好地使用這些庫,而不是在它們之間切換。

您可以從GCC's C++ Standard Library implementation的狀態頁開始。