【问题标题】:What are differences between std, tr1 and boost (as namespaces and/or libraries)?std、tr1 和 boost(作为命名空间和/或库)之间有什么区别?
【发布时间】:2011-06-08 15:34:55
【问题描述】:

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

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

std::shared_ptrstd::tr1::shared_ptrboost::shared_ptr、...等

更新

bindshared_ptr 是有助于澄清我的问题的示例。我的目的是了解这三个命名空间之间的一般差异。所有三个命名空间中都存在多个库,显然bind 是一个示例,shared_ptr 也是如此。

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

【问题讨论】:

  • 更改问题 - 添加“绑定”,问题建议您一般需要库之间的差异
  • @peenut,他清楚地询问一般差异。
  • 你需要澄清一下。你真的认为有boost::vectorboost::cout 吗?你实际上想知道什么?
  • @Johannes Schaub:我想了解将军。 boost::bind 只是我用来澄清我的问题的一个例子。我将编辑我的问题。谢谢。

标签: c++ c++11 boost tr1


【解决方案1】:

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

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

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

TR1 中的大部分内容都已标准化并位于 C++11 std 命名空间中,并且 C++11 包含的库比 TR1 中提到的更多,这些库是从 Boost 结构改编而来的,例如 @ 中定义的线程支持987654327@.

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

【讨论】:

  • @VJo,是的,但我们不要假装它不会是 C++1x:p
  • @ybungalobill +1 让我发笑。 :)
【解决方案2】:

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

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,您应该直接使用它而不是别名。

【讨论】:

    【解决方案3】:

    你的问题已经很清楚了。我可以复制/粘贴您的示例并正确回答您的问题。只有两件事真正需要扩展:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 定义是从 boost 继承的,但代码实现不是,我在 2009 年的 tr1::bind 中发现了可怕的错误,它甚至不允许您正确传递 ref()。我的感觉是,他们不能只是将 boost 代码复制到 STL 实现中,而且由于 boost 代码已经过长时间的同行评审和测试,因此它可能会逊色,因此我个人出于选择会坚持使用 boost。
      • @CashCow:感谢您的建议。但是来自 VC++ 的库 std:: 怎么样?它们比 boost 库更糟糕吗?例如 boost::regex 与 std::regex?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2014-08-10
      • 2011-12-10
      相关资源
      最近更新 更多