В чем различия между std, tr1 и boost (в виде пространств имен и / или библиотек)?

Сначала я думал, что они все одинаковые, но оказалось, что это неправильно. Так может кто-нибудь вкратце объяснить разницу между этими тремя? Например:

  1. std::bind (самое новое, следующее поколение C++)
  2. std::tr1::bind (старый, расширение C++ std)
  3. 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.

Другие вопросы по тегам