37

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

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

またはstd::shared_ptr、、、std::tr1::shared_ptrおよびboost::shared_ptr、...など

アップデート

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

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

4

4 に答える 4

38

1 -std::bind標準名です。これは、C++11 準拠のライブラリに使用する名前になります。標準化された C++のすべてのライブラリのリスト。

2 - std::tr1::bindC++ Technical Report 1 名前空間です。C++03 と C++11 の間にはC++ Technical Report 1があり、追加のライブラリと拡張機能が提案されました。これらのほとんどは、当時 Boost にすでに存在していました。これらのライブラリの変更の一部は、C++11 標準で採用されました(<regex>および<functional>を含むstd::bind)。名前std::tr1空間は、名前空間で標準化されたすべてのものとは対照的に、進行中の状態のライブラリを区別するために使用されましたstd

3 - Boostライブラリを使用している場合は、名前空間boost::bind用です。Boost には、TR1 にあるものや C++11 の std ライブラリにあるものよりもはるかに多くのものが含まれます。1.52.0 時点での Boostのすべてのライブラリのリストbindboost

TR1 にあったもののほとんどは標準化されており、C++11std名前空間にあります。C++11 には、TR1 に記載されているよりも多くのライブラリが含まれており、<thread>.

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

于 2011-01-13T17:10:48.087 に答える
10

bind(またはその他の問題)を使用する場合、名前空間の名前変更が優れた機能です。次に例を示します。

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が必要であることがわかっている場合は、エイリアスではなく直接使用する必要があります。

于 2011-01-13T17:24:25.233 に答える
6

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

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

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

于 2011-01-13T17:45:55.993 に答える
2

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

于 2011-01-13T17:12:23.163 に答える