2011-01-13 95 views
29

我最初以爲他們都是一樣的,但事實證明是錯誤的。那麼任何人都可以簡單解釋這三者之間的區別嗎?例如:std,tr1和boost(作爲名稱空間和/或庫)有什麼區別?

  1. std::bind(最新的一個,下一代C++的)
  2. std::tr1::bind(舊,C的延伸++ STD)
  3. boost::bind(完全獨立的庫)

std::shared_ptrstd::tr1::shared_ptr ,和boost::shared_ptr,...等

更新

bind,shared_ptr是有助於澄清我的問題的示例。我的意圖是理解這三個命名空間之間的一般區別。在所有三個命名空間中都有幾個庫,顯然bind就是一個例子,以及shared_ptr

我應該堅持使用哪些命名空間?我個人更喜歡std::的庫,因爲它將成爲C++(C++ 0x)的下一個標準。

+4

更改問題 - 添加「綁定」,問題表明您希望庫之間的差異通常爲 – peenut 2011-01-13 17:10:31

+0

@peenut,他*清楚地詢問了一般差異。 – 2011-01-13 17:35:19

+0

你需要澄清。你真的認爲有`boost :: vector`或`boost :: cout`嗎?你真的*想知道什麼? – 2011-01-13 17:37:46

回答

28

1 - std::bind是它的標準名稱。這將是您用於符合C++ 11的庫的名稱。所有libraries in standardized C++的列表。

2 - std::tr1::bind是C++技術報告1命名空間。在C++ 03和C++ 11之間有C++ Technical Report 1,它提出了額外的庫和增強。其中大部分已經存在於Boost當中,其中一些庫更改已在C++ 11標準中採用,如<regex><functional>(其中包含std::bind)。使用std::tr1名稱空間來區分處於工作進行狀態的庫,而不是在std名稱空間中標準化的所有內容。

3 - boost::bind用於boost命名空間中的bind(如果使用的是Boost庫)。 Boost包含的內容遠遠多於TR1中的內容,以及我在C++ 11的std庫中的內容。全部列表libraries in Boost as of 1.52.0

TR1中的大部分內容已經標準化,位於C++ 11 std命名空間中,C++ 11包含比TR1中提到的更多的庫,這些庫是從Boost構造中修改的,例如線程支持在<thread>中定義。

什麼定義你可以使用什麼以及你現在可以使用哪個命名空間的一部分取決於你的編譯器。我不記得,但我認爲最近的GCC-g ++實現已經開始爲新的C++ 11庫使用std命名空間,但可能需要一個不同的編譯器標誌來激活它。儘管如此,它們仍然支持std::tr1命名空間。 Visual C++ 2010將以前在std::tr1中的內容移入正常的std名稱空間,但Visual C++ 2008仍使用std::tr1

2

它應該不會有很大的不同,因爲下一個C++標準的大部分實際上是從Boost繼承的。因此,如果你有std::bind,並且不必與其他編譯器兼容,只需使用它。boost::bind很好,如果你想獨立於編譯器。如果可用,我認爲std::tr1::bind與其他兩個版本沒有任何優勢:它對於C++ 03和C++ 0x都是非標準的。

9

如果你想使用綁定(或任何其他針對此事),一個很好的功能是命名空間重命名,這裏有一個例子:

namespace MyNamespace = boost; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

現在,如果你改變了myNameSpace是:

namespace MyNamespace = std::tr1; 

以下用途std::tr1::bind

namespace MyNamespace = std::tr1; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

你應該的,當然,使用要方便地改變它的命名空間在未來,如果你知道你想要的std :: TR1,你應該直接和從來沒有一個別名使用它的元素myNameSpace對象。

5

你幾乎已經在你的問題得到它。我可以複製/粘貼你的例子,並正確回答你的問題。只有兩件事情因爲需要擴展而真正脫穎而出:

1)確切地說以及爲什麼std ::被tr1擴展。 TR1是「技術報告1」,是其分組之一向標準委員會提出的第一套官方圖書館擴展。所以它不僅僅是標準的延伸。

2)boost :: bind的實際行爲與std :: bind的行爲不同,至少在某些系統上。我不知道它是不是標準的,但在MSVC中,lambda表達式和std :: bind彼此表現非常差。也許還有其他一些方法,我不記得,因爲我制定了使用boost :: bind而不是std :: bind的策略。返回值模板參數似乎經常被msvc上的std :: bind忽略,所以當你用std::bind<type>(...)指定時,你會得到有關沒有return_value<f>::type(或其他)的錯誤。從來沒有費心去弄清楚行爲的確切區別,因爲boost :: bind已經將它變成了我們常用的詞彙表,我們知道如何使用它。

相關問題