2010-05-30 67 views
5

什麼是結合 使用autoconfshared_ptr等TR1/BOOST的C++ 0x模板,以便最大限度地 可移植性和可維護性的最佳實踐?如何使用autoconf與C++ 0x特性的

隨着autoconf我能確定shared_ptr是否是 可以作爲std::tr1::shared_ptr和/或boost::shared_ptr。鑑於 ,同樣的功能有兩個不同的名字,我有以下 問題:

  1. 在代碼中,應該如何shared_ptr引用?
  2. 應該std::tr1::shared_ptr優於boost::shared_ptr

對於第一,代碼當前正在使用的預處理程序條件 允許非合格引用shared_ptr,一拉

#if HAVE_STD_TR1_SHARED_PTR 
using std::tr1::shared_ptr; 
#elif HAVE_BOOST_SHARED_PTR 
using boost::shared_ptr; 
#else 
#error "No definition for shared_ptr found" 
#endif 

其次,代碼使用std::tr1::超過boost::以最小化對外部庫 依賴性(即使庫被廣泛使用的 )。

這兩種解決方案常見嗎?有更好的嗎?

回答

3

一個改進你的示例代碼,並回答你的第一個問題,就是用「template typedef」成語:

#if HAVE_STD_TR1_SHARED_PTR 
    template <class T> 
    struct SharedPtr { 
     typedef std::tr1::shared_ptr<T> Type; 
    }; 
#elif HAVE_BOOST_SHARED_PTR 
    template <class T> 
    struct SharedPtr { 
     typedef boost::shared_ptr<T> Type; 
    }; 
#else 
# error "No definition for shared_ptr found" 
#endif 

// Declare a shared_ptr using our wrapper classes, saving us from having to care 
// where shared_ptr comes from: 
SharedPtr<int>::Type my_shared_int(new int(42)); 

與此的主要問題是使用::類型符號的需要。純粹是因爲C++目前無法爲模板定義typedef。您可以爲模板類型實例設置typedef,但在此我們保留通用性很重要。

至於你是否應該更喜歡TR1來提升,我會說是。既然編譯器在部分支持C++ 0x的情況下運行,我會說你也應該測試std :: shared_ptr,並且選擇其他的。

如果有其他地方有shared_ptr的編譯器,則可能需要第四個typedef。我不知道這樣的編譯器,但是我維護的一些C++代碼與標準C++庫的普通slist擴展中關於單鏈表的問題類似。舊的g ++版本把它放在全局命名空間中,現代g ++把它放在編譯器特定的命名空間__gnu_cxx中,我們甚至發現一個錯誤地將它放在std

+0

我沒有看到你的模板typedef增加了原始海報的建議。他與shared_ptr 「污染」的東西。你用SharedPtr :: Type污染了一些東西。兩者看起來都相當,而且他的打字也較少。 除了原始文章中的using語句之外,您的模板typedef還有什麼功能? – 2010-05-31 02:15:36

+0

您點擊它:您不再需要將這些名稱提取到全局名稱空間中。我的方法不一定會添加全局名稱;你可以命名空間,如果你喜歡。如果你不這樣做,我的可能性與另一個圖書館中的姓名衝突的可能性就小得多。 – 2010-05-31 03:22:09

+0

鑑於shared_ptr最終將在std ::中,並且autoconf可以確定在哪個名稱空間中定義了shared_ptr,如果沒有定義std :: shared_ptr,我傾向於使用「namespace std {using :: shared_ptr;}」。 – themis 2010-05-31 20:29:08