web-dev-qa-db-ja.com

std、tr1、およびboost(ネームスペースやライブラリとして)の違いは何ですか?

最初はすべて同じだと思っていましたが、間違っていることがわかりました。では、これらの3つの違いを誰かが簡単に説明できますか?例えば:

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

またはstd::shared_ptrstd::tr1::shared_ptrboost::shared_ptr、... etc

更新

bindshared_ptrは、私の質問を明確にするのに役立つ例です。私の意図は、これら3つの名前空間の一般的な違いを理解することでした。 3つのネームスペースすべてに存在するライブラリがいくつかあり、shared_ptrだけでなく、bindもその1つの例です。

どの名前空間を使用すればよいですか?個人的にはstd::のライブラリがC++の次の標準(C++ 0x)になるので、それを好みます。

32
Chan

1- std::bind はその標準名です。これは、C++ 11準拠のライブラリに使用する名前になります。すべてのリスト 標準化された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 ライブラリを使用している場合、bind名前空間のboost用です。 Boostは、TR1にあるものやC++ 11のstdライブラリにあるものよりもはるかに多くを網羅しています。すべてのリスト Boostのライブラリ(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が使用されていました。

31
wkl

Bind(またはその他の問題について)を使用する場合、Nice機能は名前空間の名前変更です。以下に例を示します。

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( ... );
}

もちろん、将来名前空間を簡単に変更したい要素にはMyNamespaceを使用する必要があります。std:: tr1が必要であることがわかっている場合は、直接使用し、エイリアスは使用しないでください。

10
MatiasFG

あなたはそこにあなたの質問でほとんどそれを持っています。私はあなたの例をコピーして貼り付け、あなたの質問に正しく答えることができました。拡張が必要な​​こととして、本当に2つだけ際立っています。

1)正確な方法とstd ::がtr1によって拡張される理由TR1は「Technical Report 1」であり、そのサブグループの1つによって標準委員会に提案された最初の公式のライブラリ拡張セットです。したがって、これは標準の単なる拡張ではありません。

2)boost :: bindの動作は、少なくとも一部のシステムではstd :: bindとは異なります。標準ではないがMSVCラムダ式とstd :: bindが相互に非常にうまく動作しないかどうかはわかりません。他の方法もあるかもしれませんが、std :: bindではなくboost :: bindを使用することをポリシーにしたので、覚えていません。戻り値のテンプレートパラメータは、msvcのstd :: bindでは無視されることが多いため、std::bind<type>(...)で指定したときにreturn_value<f>::type(またはその他)がないというエラーが発生します。 boost :: bindが通常のボキャブラリにすでに組み込まれており、その使用方法を知っていたので、動作の正確な違いを気にする必要はありません。

5
Edward Strange

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

2
Philipp