Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2

Phoenix и его placeholders

07.06.2015, 16:01. Показов 1447. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такая задачка у меня: надо заменить закоментированный код с лямбдой на выражение с использованием phoenix placeholders.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <boost/range/algorithm.hpp>
 
#include <boost/phoenix/phoenix.hpp>
#include <boost/phoenix/function/adapt_function.hpp>
#include <boost/phoenix/core/argument.hpp>
#include <boost/phoenix/operator.hpp>
#include <boost/phoenix/statement/if.hpp>
#include <boost/phoenix/stl/container.hpp>
#include <boost/phoenix/stl/algorithm.hpp>
#include <boost/phoenix/scope/let.hpp>
#include <boost/phoenix/scope/local_variable.hpp>
 
namespace br = boost::range;
namespace phx = boost::phoenix;
using namespace phx::placeholders;
using namespace boost::phoenix::local_names;
 
struct person
{
   std::string name;
   int age;
};
 
std::ostream & operator <<(std::ostream  &os, person const &p)
{
   return os << "{" << p.name << ", " << p.age << "}";
}
 
bool has_this_age(person const &p, int age_)
{
   return p.age == age_;
}
 
BOOST_PHOENIX_ADAPT_FUNCTION(bool, has_this_age_, has_this_age, 2)
 
int main()
{
   std::vector<person> vp{{"Name1", 21}, {"Name2", 22}, {"Name3", 23}, {"Name4", 22}, {"Name5", 22},
                         {"Name6", 28}, {"Name7", 20}, {"Name8", 23}, {"Name9", 22}, {"Name10", 19}};
   std::vector<int> ages{18, 22, 23, 30, 15, 28};
   std::vector<person> selected;
 
//   br::for_each(ages, [&](int age_)
//   {
//      auto it = br::find_if(vp, has_this_age_(arg1, age_));
//      if (it != vp.end())
//         selected.push_back(*it);
//   });
 
   using phx::let;
   using phx::if_;
   using phx::push_back;
   using phx::ref;
 
   br::for_each(ages, let(_a = arg1, _b = br::find_if(vp, has_this_age_(arg1, _a)))
   [
      if_(_b != vp.end()) [push_back(ref(selected), *_b)]
   ]);
 
 
   br::for_each(selected, std::cout << arg1 << " ");
}
Мой вариант не компилируется. Может кто что предложит, как решить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2015, 16:01
Ответы с готовыми решениями:

update pdo placeholders
Приветствую вас форумчане. Помогите пожалуйста, пытаюсь на pdo обновить данные в базе, но там вылазиет ошибка: Fatal error: Uncaught...

Какую задачу решает std::placeholders ?
Встречал примеры в паре с std::bind но так и не понял суть (bind понимаю зачем нужен, а вот плейсхолдеры нет) Объясните пожалуйста кто...

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

1
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.06.2015, 14:27  [ТС]
Может кто подскажет хотя бы с таким примером:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <boost/range/algorithm.hpp>
#include <boost/phoenix/core/argument.hpp>
#include <boost/phoenix/operator.hpp>
#include <boost/phoenix/stl/algorithm.hpp>
#include <boost/phoenix/stl/container.hpp>
#include <boost/phoenix/statement/if.hpp>
 
namespace br = boost::range;
namespace phx = boost::phoenix;
using namespace phx::placeholders;
using phx::if_;
using phx::end;
 
int main()
{
   std::vector<int> v1{1,2,3,4,5,6,7,8,9};
   std::vector<int> v2{2,4,6};
 
   br::for_each(v2, if_(phx::find(v1, arg1) != end(v1))[std::cout << "Found/n"]);
}
Добавлено через 38 минут
Уже разобрался сам: надо было так написать:
C++
1
br::for_each(v2, if_(phx::find(v1, arg1) != end(v1))[std::cout << "Found: " << arg1 << ", "]);
Добавлено через 24 минуты
Вот значит так - это работает:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
   std::vector<int> v1{1,2,3,4,5,6,7,8,9};
   std::vector<int> v2{2,4,6};
   std::vector<int> res;
 
   br::for_each(v2, if_(phx::find(v1, arg1) != end(v1))
                [phx::push_back(phx::ref(res), arg1)]);
 
   br::for_each(res, std::cout << arg1 << " ");;
}
Мне хочется сделать тоже самое к моему случаю. Как то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
   std::vector<person> vp{{"Name1", 21}, {"Name2", 22}, {"Name3", 23}, {"Name4", 22}, {"Name5", 22},
                         {"Name6", 28}, {"Name7", 20}, {"Name8", 23}, {"Name9", 22}, {"Name10", 19}};
   std::vector<int> ages{18, 22, 23, 30, 15, 28};
   std::vector<person> selected;
   
   br::for_each(vp, if_(phx::find_if(vp, has_this_age_(?, arg1)))
                [phx::push_back(phx::ref(selected), arg1)]);
   
   br::for_each(selected, std::cout << arg1 << " ");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2015, 14:27
Помогаю со студенческими работами здесь

Bios Phoenix ???
У меня compaq presario cq60, bios phoenix. Нужно в биосе найти настройки видео карты. Перешарил вроде весь биос, ни где ни чего похожего...

Как можно еще использовать std::placeholders вне в связки с std::bind?
Добрый день! Как можно еще использовать std::placeholders вне в связки с std::bind?

Обновить BIOS Phoenix
обновить bios phoenix версии 6.00 дата системного bios 12.21.2009, дата bios видеоадаптера 05.16.07. Можно чем помочь плизз?

Phoenix BIOS не видит флешку
Здравствуйте. Сегодня пытался переустановить Windows и столкнулся с проблемой. Я через UltraISO сделал загрузочную флешку и подключив ее к...

Предлагаю рекламное приложение Phoenix
Доброе время суток. Я предлагаю вашему вниманию, рекламное приложение для MS Windows, Phoenix. С его помощью, вы легко сможете...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru