Разница между boost :: bind, boost :: lambda :: bind и boost :: phoenix :: bind - PullRequest
11 голосов
/ 07 ноября 2011

Я пытаюсь понять разницу между этими разными подходами связывания.Есть похожий вопрос в boost :: bind и boost :: phoenix :: bind

Но если кто-нибудь сможет объяснить это с помощью примеров, это было бы здорово.Также верно ли, что boost :: phoenix - это расширенный набор библиотек boost :: bind, booost :: lambda?

Ответы [ 2 ]

10 голосов
/ 09 ноября 2011

Я думаю, что история (хотя я и не достаточно стара, чтобы рассказать всю историю), boost :: bind была впервые создана для замены сложного в использовании bind1st / bind2nd в C ++ 98, и она достигает его цель и теперь часть C ++ 11. Но также как и в последние 10 лет, когда появился стиль функционального программирования в C ++, boost :: lambda продвигает его настолько далеко (во время его создания), что поддерживает достаточно широкий набор функциональных конструкций с чисто библиотечным подходом в C ++. 1001 *

И затем, как я знаю из группы новостей, автор boost :: lambda и boost :: phoenix пытаются объединить две библиотеки, поскольку они решают практически одну и ту же проблему. Я думаю, это был великолепно разработанный буст :: phoenix2

И затем идет boost :: proto, который является библиотекой для написания шаблонов выражений, или я бы сказал, что это метабиблиотека. Таким образом, нирвана феникса снова, возрождается на boost :: proto, тогда мы видим phoenix3. Я думаю, что Phoenix3 является самым мощным среди всех выше.

С другой стороны, в C ++ 11 добавлена ​​языковая поддержка лямбда-выражений, что лично мне кажется очень полезным и удобным. Единственный недостаток - он не полиморфен (в то время как phoenix3 позволяет создавать объекты полиморфных функций).

В заключение, я пришел с личным опытом, лямбда-выражение C ++ 11 - это выбор для повседневной работы, если таковой имеется. Это удобно, понятно и удобно во время компиляции. Phoenix3 - полимофический, очень мощный, очень крутой, с недостатком долгого времени компиляции.

1 голос
/ 09 ноября 2011

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

Примеры чего? Это разные реализации одной концепции.

Вот что на самом деле важно:

  1. Boost.Lambda официально объявлен устаревшим с тех пор, как Boost.Phoenix был выпущен как отдельная библиотека (и, конечно, boost::lambda::bind вместе с этим).
  2. Реализация boost::bind будет заменена на реализацию boost::phoenix::bind в будущем. Единственная причина, по которой он еще не был заменен, заключается в том, что boost::bind поддерживает / имеет обходные пути для старых (читай: неработающих) компиляторов, например MSVC6, тогда как Boost.Phoenix строго требует C ++ 03-совместимого компилятора.

Объедините эти два факта, и станет ясно, что единственным реальным кандидатом для использования в новом коде является boost::phoenix::bind.

Также верно ли, что boost :: phoenix - это расширенный набор библиотек boost :: bind, booost :: lambda?

Да, это правильно.

...