我最初认为他们都是一样的,但事实证明是错的。那么有人可以简单地解释这三者之间的差异吗?例如:
std::bind
(最新一代,下一代C ++)std::tr1::bind
(旧的,C ++标准的扩展名)boost::bind
(完全独立的图书馆)或std::shared_ptr
,std::tr1::shared_ptr
和boost::shared_ptr
,...等
更新
bind
,shared_ptr
是帮助澄清我的问题的示例。我的目的是了解这三个命名空间之间的一般差异。所有三个名称空间中都存在多个库,显然bind
是一个示例,以及shared_ptr
。
我应该坚持哪些命名空间?我个人更喜欢来自std::
的库,因为它将成为C ++(C ++ 0x)的下一个标准。
答案 0 :(得分:31)
1 - std::bind
是它的标准名称。这将是您用于C ++ 11兼容库的名称。所有libraries in standardized C++的列表。
2 - std::tr1::bind
是C ++ Technical Report 1命名空间。在C ++ 03和C ++ 11之间有C++ Technical Report 1,它提出了额外的库和增强功能。其中大部分已经存在于Boost中,其中一些库更改在C ++ 11标准中采用,如<regex>
和<functional>
(包含std::bind
)。 std::tr1
命名空间用于区分处于工作进度状态的库,而不是std
命名空间中标准化的所有内容。
3 - boost::bind
适用于bind
命名空间中的boost
,如果您使用的是Boost库。 Boost包含的内容远远多于TR1和C ++ 11的std库中的内容。所有libraries in Boost as of 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
。
答案 1 :(得分: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,则应该直接使用它而不是别名。
答案 2 :(得分: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已经使它成为我们的常规词汇,我们知道如何使用它。
答案 3 :(得分:2)
它不应该产生很大的不同,因为下一个C ++标准的大部分实际上都是从Boost继承的。因此,如果您有std::bind
并且不必与其他编译器兼容,那么只需使用它。如果您想要独立于编译器,则boost::bind
是好的。我认为std::tr1::bind
与其他两个相比没有任何优势:如果它们可用:它对C ++ 03和C ++ 0x都是非标准的。