В чем различия между std, tr1 и boost (в виде пространств имен и / или библиотек)?
Сначала я думал, что они все одинаковые, но оказалось, что это неправильно. Так может кто-нибудь вкратце объяснить разницу между этими тремя? Например:
std::bind
(самое новое, следующее поколение C++)std::tr1::bind
(старый, расширение C++ std)boost::bind
(полностью отдельная библиотека)
или же std::shared_ptr
, std::tr1::shared_ptr
, а также boost::shared_ptr
,...так далее
Обновить
bind
, shared_ptr
Вот примеры, которые помогают уточнить мой вопрос. Я хотел понять общие различия между этими тремя пространствами имен. Есть несколько библиотек, которые существуют во всех трех пространствах имен, и, по-видимому, bind
является одним из примеров, а также shared_ptr
,
Какие пространства имен я должен придерживаться? Я лично предпочитаю библиотеку из std::
так как это будет следующий стандарт C++ ( C++0x).
4 ответа
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::bind
для bind
в boost
пространство имен, если вы используете библиотеку Boost. Boost включает в себя гораздо больше, чем то, что есть в TR1 и что я в стандартной библиотеке C++ 11. Список всех библиотек в 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
,
Если вы хотите использовать связывание (или любое другое), хорошей особенностью является переименование пространства имен, вот пример:
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, вы должны использовать его напрямую, а не псевдоним.
Вы в значительной степени поняли это в своем вопросе. Я мог бы просто скопировать / вставить ваш пример и правильно ответить на ваш вопрос. Только две вещи действительно нуждаются в расширении:
1) Точно КАК и почему std:: расширяется на tr1. TR1 - "Технический отчет 1" и является первым официальным набором расширений библиотеки, предложенным комитету по стандартам одной из его подгрупп. Так что это немного больше, чем просто расширение стандарта.
2) boost:: bind на самом деле ведет себя иначе, чем std:: bind, по крайней мере, в некоторых системах. Я не знаю, если это по стандарту не, но в MSVC лямбда-выражения и std:: bind ведут себя очень плохо друг с другом. Может быть, есть и другие способы, я не припомню, потому что я решил использовать boost:: bind вместо std:: bind. Параметр шаблона возвращаемого значения часто игнорируется с помощью std:: bind в msvc, так что вы получаете ошибки об отсутствии return_value<f>::type
(или что-то еще), когда вы указали это с std::bind<type>(...)
, Никогда не удосужился выяснить точную разницу в поведении, так как boost:: bind уже вошел в наш обычный словарь, и мы знали, как его использовать.
Это не должно иметь большого значения, так как большие части следующего стандарта C++ фактически унаследованы от Boost. Так что если у вас есть std::bind
и не обязательно быть совместимым с другими компиляторами, просто используйте его.boost::bind
хорошо, если вы хотите быть независимым от компилятора. Я думаю std::tr1::bind
не имеет никаких преимуществ перед двумя другими, если они доступны: это нестандартно по отношению к C++03 и C++0x.