2011-01-13 9 views
29

私は当初彼らはすべて同じだと思っていましたが、間違っていることが判明しました。だから誰も簡単にこれらの3つの違いを説明できますか?例えば:std、tr1とboostの違いは何ですか(名前空間やライブラリとして)?

  1. std::bind(最新のもの、C++の次世代)
  2. std::tr1::bind(C++のstdの古い、拡張)
  3. boost::bind(完全に別個のライブラリ)

又はstd::shared_ptrstd::tr1::shared_ptrboost::shared_ptr、...

更新

bind,shared_ptrは、私の質問を明確にするのに役立つ例です。私の意図は、これら3つの名前空間の一般的な違いを理解することでした。 3つの名前空間のすべてに存在するライブラリがいくつか存在し、のように、bindが一例です。

私はどの名前空間を使用しますか?私は個人的にはstd::のライブラリを好んでいます。これはC++(C++ 0x)の次の標準になるからです。

+4

質問を変更する - 「バインド」を追加すると、一般的なライブラリの違いがあることが示唆されています – peenut

+0

@peenut、彼*は*一般的な違いについてはっきりと質問しています。 –

+0

あなたは明確にする必要があります。実際には 'boost :: vector'や' boost :: cout'があると思いますか?あなたは実際に何を知りたいのですか? –

答えて

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に既に存在し、これらのライブラリの一部は<regex><functional>std::bindを含む)のようなC++ 11標準で採用されました。 std名前空間で標準化されているすべてのものとは対照的に、std::tr1名前空間を使用して、作業進行中の状態のライブラリを区別しました。

3 - boost::bindは、Boostライブラリを使用している場合、boost名前空間のbindです。 Boostは、TR1のものよりもはるかに多く、C++ 11の標準ライブラリの何を含んでいます。すべてのリストlibraries in Boost as of 1.52.0

TR1のほとんどは標準化されており、C++ 11 std名前空間にあり、C++ 11にはTR1で言及されているものより多くのライブラリが含まれており、スレッドのサポート<thread>で定義されている。

あなたが使用できるものと現在使用できる名前空間の定義の一部は、コンパイラによって異なります。私は思い出しませんが、最近のGCC-g ++の実装では新しいC++ 11ライブラリにstd名前空間を使い始めましたが、それを有効にするには別のコンパイラフラグが必要かもしれないと思います。彼らはまだstd::tr1名前空間をサポートします。 Visual C++ 2010は以前std::tr1にあるものを通常のstd名前空間に移動しましたが、Visual C++ 2008はまだstd::tr1を使用していました。

+1

@VJo、ええ、でも、それはC++ 1xにならないふりをしません:p – birryree

+4

それはC++になりそうです0C – ybungalobill

+1

@ybungalobill +1は私を笑わせてくれます。 :) – birryree

2

次のC++標準の大部分がBoostから実際に継承されたので、大きな違いはありません。したがって、std::bindがあり、他のコンパイラと互換性がある必要がない場合は、それを使用してください。コンパイラに依存しない場合は、boost::bindが良いです。私はstd::tr1::bindは利用可能な場合、他の2つ以上の利点がないと思う:C + + 03とC + + 0xの両方に関して非標準です。

+1

定義はboostから継承されましたが、コードの実装はそうではなく、ref1を正しく渡すことさえ許さない2009年にtr1 :: bindの恐ろしいバグが見つかりました。ブーストコードをSTL実装にコピーするだけでは不十分であり、ブーストコードがピアレビューされ、長期間にわたってテストされているため、劣っている可能性があるので、私は個人的に選択肢から外れてしまいます。 – CashCow

+0

@CashCow:助けてくれてありがとう。しかし、ライブラリについてはどのようにstd :: VC++からですか?ライブラリを増強するより悪いですか?例えばboost :: regexとstd :: regexの違いは? – Chan

9

は、あなたがバインド(またはことについては、他)を使用したい場合は、便利な機能は、ここでは、名前空間の名前を変更した例である:

:あなたがするMYNAMESPACEを変更した場合、今

namespace MyNamespace = boost; 

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

namespace MyNamespace = std::tr1; 

std::tr1::bindを使用します。

namespace MyNamespace = std::tr1; 

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

あなたは、もちろん、あなたが簡単にあなたがのstd ::あなたが直接、決して別名、それを使用する必要がありますTR1をしたい知っていれば、それは、将来的には、名前空間です変更したい要素のためのMYNAMESPACEを使用する必要があります。

+0

非常にクールなトリックのおかげで! – Chan

5

あなたの疑問にお答えします。あなたの例をコピーして貼り付けて、あなたの質問に正しく答えることができました。拡張を必要とするものとして、2つのことだけが本当に際立っています。

1)正確にはどのように、なぜstd ::がtr1によって拡張されているのですか。 TR1は「テクニカルレポート1」であり、サブグループの1つによって標準化委員会に提案されたライブラリ拡張の最初の公式のセットです。だから、標準の拡張以上のものです。

2)boost :: bindは実際には少なくともいくつかのシステムではstd :: bindとは異なる動作をします。私はMSVCラムダ式ではなく、std :: bindで標準であるかどうかは分かりません。他の方法もあるかもしれませんが、std :: bindではなくboost :: bindを使うようにしたので、私は思い出しません。戻り値のテンプレートのパラメータは、std::bind<type>(...)で指定したときに、return_value<f>::type(または何でも)が存在しないというエラーが出るように、msvcのstd :: bindで無視されるようです。 boost :: bindはすでに正規の語彙になっていて、それを使う方法を知っていたので、動作の正確な違いを理解することには決して悩まされませんでした。

関連する問題