Разница между boost:: bind, boost:: lambda:: bind и boost:: phoenix:: bind

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

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

Ответ 1

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

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

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

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

В качестве вывода о том, что я прихожу с личным опытом, выражение лямбда С++ 11 - это выбор для повседневной работы, если таковой имеется. Он удобен, понятен и удобен во время компиляции. Phoenix3 является полиморфным, очень мощным, очень крутым, с недостатком длительной компиляции.

Ответ 2

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

Примеры чего? Они представляют собой разные реализации одной и той же концепции.

Вот что действительно важно:

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

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

Также верно, что boost:: phoenix является надмножеством библиотек boost:: bind, booost:: lambda?

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