簡體   English   中英

用於boost / c ++ 11的C ++包裝器

[英]C++ wrapper for boost/c++11

我不確定問題的標題是否合適。 這是問題所在。 我正在編寫一個使用一些c ++ 11庫特性的庫。 顯然,並非所有實現都支持這些庫,因此存在可移植性問題。 這里關注哪個庫並不重要。 一種解決方案是使用boost,它已經提供了很多c ++ 11庫。 所以我的解決方案是定義一個宏,比如USE_CXX11 ,並定義一個新的命名空間,比如internal並根據宏將名稱引入這個內部命名空間。 例如,我需要使用來自c ++庫<foo>的名稱foo ,這也可以在<boost/foo/foo.hpp> 我做的是

#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。 我的庫將獲取正確的標題和命名空間。 這項工作到目前為止。 希望我已經很好地解釋了我的意圖。

但上述解決方案對我來說似乎非常難看。 對於這種事情,有沒有更好的做法? 或者有任何可能的情況,這種方法不起作用?

你的解決方案對我來說很好; 在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
}}

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

如果可用性是C ++ 03和C ++ 11之間的關注點,那么你肯定應該使用Boost來實現一切。 如果C ++ 11是您唯一的目標,您可以更好地評估各種編譯器,以查看它們支持的語言和庫功能。 選擇那些得到良好支持並被視為無bug的應用程序。 對於其他所有內容,如果需要,可以在以后使用Boost和重構​​來支持更多C ++ 11庫功能。 你最好不要串聯使用這些庫,而不是在它們之間切換。

您可以從GCC的C ++標准庫實現的狀態頁面開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM