Каковы различия между std, tr1 и boost (как пространства имен и / или библиотеки)? - PullRequest
32 голосов
/ 13 января 2011

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

  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 ]

31 голосов
/ 13 января 2011

1 - std::bind - стандартное название для него. Это будет имя, которое вы используете для C ++ 11-совместимых библиотек. Список всех библиотек в стандартизированном C ++ .

2 - std::tr1::bind - пространство имен Технического отчета C ++ 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.

10 голосов
/ 13 января 2011

Если вы хотите использовать связывание (или любое другое), хорошая функция - переименование пространства имен, вот пример:

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, вы должны использовать его напрямую, а не псевдоним.

5 голосов
/ 13 января 2011

У вас там в значительной степени есть вопрос. Я мог бы просто скопировать / вставить ваш пример и правильно ответить на ваш вопрос. Только две вещи действительно нуждаются в расширении:

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 уже вошел в наш обычный словарь, и мы знали, как его использовать.

2 голосов
/ 13 января 2011

Это не должно иметь большого значения, так как большие части следующего стандарта C ++ фактически были унаследованы от Boost. Так что если у вас std::bind и вам не нужно быть совместимым с другими компиляторами, просто используйте его. boost::bind хорошо, если вы хотите быть независимым от компилятора. Я думаю, что std::tr1::bind не имеет никаких преимуществ перед двумя другими, если они доступны: это нестандартно по отношению к C ++ 03 и C ++ 0x.

...