std,tr1和boost之间有什么区别(作为命名空间和/或库)?

Cha*_*han 32 c++ boost tr1 c++11

我最初认为他们都是一样的,但事实证明是错的.那么有人可以简单地解释这三者之间的差异吗?例如:

  1. std::bind (最新一代,下一代C++)
  2. std::tr1::bind (旧的,C++ std的扩展)
  3. boost::bind (完全独立的图书馆)

或者std::shared_ptr,std::tr1::shared_ptrboost::shared_ptr,...等

更新

bind,shared_ptr是有助于澄清我的问题的例子.我的目的是了解这三个命名空间之间的一般差异.所有三个名称空间中都有几个库,显然bind是一个例子,以及shared_ptr.

我应该坚持哪些名称空间?我个人更喜欢库,std::因为它将成为C++的下一个标准(C++ 0x).

wkl*_*wkl 31

1 - std::bind是它的标准名称.这将是您用于C++ 11兼容库的名称.标准化C++中所有库的列表.

2 - std::tr1::bind是C++ Technical Report 1命名空间.在C++ 03和C++ 11之间有C++技术报告1,它提出了额外的库和增强功能.其中大部分已经存在于Boost中,其中一些库更改在C++ 11标准中采用,如<regex><functional>(包含std::bind).该std::tr1命名空间是用来区分他们的工作中状态的库,而不是一切都在标准化的std命名空间.

3 - boost::bindbindboost命名空间中,如果您使用的是加速库.Boost包含的内容远远多于TR1和C++ 11的std库中的内容.Boost中所有库的列表,自1.52.0起

TR1中的大多数内容已经标准化,并且在C++ 11 std命名空间中,而C++ 11包含的库比TR1中提到的更多,这些库是从Boost构造中改编而来的,就像在中定义的线程支持一样<thread>.

定义您可以使用的内容以及您现在可以使用的命名空间的部分内容取决于您的编译器.我不记得了,但我认为最新的GCC-g ++实现已经开始使用std新的C++ 11库的命名空间,但可能需要一个不同的编译器标志来激活它.他们仍然会支持std::tr1命名空间.Visual C++ 2010将之前的内容移动std::tr1到普通std命名空间中,但仍使用Visual C++ 2008 std::tr1.

  • 它将是C++ 0C (4认同)

Mat*_*sFG 10

如果你想使用bind(或任何其他的东西),一个很好的功能是命名空间重命名,这是一个例子:

namespace MyNamespace = boost;

void DoSomething(void)
{
    MyNamespace::bind( ... );
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您将MyNamespace更改为:

namespace MyNamespace = std::tr1;
Run Code Online (Sandbox Code Playgroud)

以下用途std::tr1::bind.

namespace MyNamespace = std::tr1;

void DoSomething(void)
{
    MyNamespace::bind( ... );
}
Run Code Online (Sandbox Code Playgroud)

当然,您应该将MyNamespace用于您希望将来轻松更改其命名空间的元素,如果您知道您想要std :: tr1,则应该直接使用它而不是别名.


Edw*_*nge 5

你在那里的问题中已经得到了很多.我可以复制/粘贴您的示例并正确回答您的问题.只有两件事需要扩展才能真正脱颖而出:

1)究竟如何以及为什么std ::由tr1扩展.TR1是"技术报告1",是其子组之一向标准委员会提出的第一套官方图书馆扩展.所以它不仅仅是标准的延伸.

2)boost :: bind实际上与std :: bind的行为不同,至少在某些系统上是这样.我不知道它是否按标准而不是在MSVC lambda表达式中,并且std :: bind在彼此之间的表现非常差.也许还有其他一些方法,我不记得了,因为我制定了使用boost :: bind而不是std :: bind的策略.返回值模板参数似乎经常被msvc上的std :: bind忽略,因此return_value<f>::type当你指定它时,你会得到关于没有(或其他)的错误std::bind<type>(...).从来没有费心去弄清楚行为的确切差异,因为boost :: bind已经使它成为我们的常规词汇,我们知道如何使用它.