37

我最初以为它们都是一样的,但结果证明是错误的。那么有人能简单解释一下这三者之间的区别吗?例如:

  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是有助于澄清我的问题的例子。我的目的是了解这三个命名空间之间的一般差异。所有三个名称空间中都存在多个库,显然bind是一个示例,以及shared_ptr.

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

4

4 回答 4

38

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

2 -std::tr1::bind是 C++ 技术报告 1 命名空间。在 C++03 和 C++11 之间有C++ Technical Report 1,它提出了额外的库和增强功能。其中大部分在当时已经存在于 Boost 中,并且其中一些库更改已在 C++11 标准中采用,例如<regex>and <functional>(其中包含std::bind)。std::tr1命名空间用于区分处于工作进行中状态的库,而不是命名空间中标准化的所有内容std

3 -boost::bind用于命名空间bindboost,如果您使用的是Boost库。Boost 包含的内容远远超过 TR1 中的内容和 C++11 的 std 库中的内容。截至 1.52.0 的 Boost中所有库的列表

TR1 中的大部分内容都已标准化并位于 C++11std命名空间中,并且 C++11 包含的库比 TR1 中提到的更多,这些库是从 Boost 结构改编而来的,例如<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

如果您想使用绑定(或任何其他),一个不错的功能是命名空间重命名,这是一个示例:

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

你在那里的问题中几乎得到了它。我可以复制/粘贴您的示例并正确回答您的问题。只有两件事真正需要扩展:

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 已经成为我们的常规词汇并且我们知道如何使用它以来,从来没有费心去弄清楚行为的确切差异。

于 2011-01-13T17:45:55.993 回答
2

它不应该有很大的不同,因为下一个 C++ 标准的大部分实际上是从 Boost 继承的。因此,如果您有std::bind并且不必与其他编译器兼容,只需使用它即可。boost::bind如果您想独立于编译器,那就太好了。如果它们可用,我认为std::tr1::bind与其他两个相比没有任何优势:它对于 C++03 和 C++0x 都是非标准的。

于 2011-01-13T17:12:23.163 回答