Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
John Prick
839 / 770 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
Завершенные тесты: 3
1

Применение вложенных boost::bind

30.01.2015, 17:12. Просмотров 1277. Ответов 4
Метки нет (Все метки)

Есть такая задача, носящая, скорее, педагогический, нежели практический характер. В общем, в контейнере ведётся поиск двух соседних элементов, удовлетворяющих некоторому условию:
C++
1
2
3
4
5
bool func1(int a, int b) { return (a == A1) && (b == B1); }
bool func2(int a, int b) { return (a == A2) && (b == B2); }
bool func(int a, int b) { return func1(a, b) || func2(a, b); }
// ...
std::adjacent_find(cont.begin(), cont.end(), func);
Вот хотелось бы тут, используя boost::bind, и не используя никаких других функций, получить требуемый результат. Как пользоваться boost::bind в простых случаях, я знаю. Но тут явно понадобятся вложенные bind'ы. Не сильно пристальный гуглинг выдал только такое:
Связыватели могут вкладываться друг в друга. Единственное, что в этом случае надо «держать в голове» - это то, что плейсхолдеры, вне зависимости от того, в каком bind'ере (по уровню вложенности) они находятся, «адресуют» параметры самого внешго binder'а.
И никаких подходящих примеров.

Как осуществить желаемое? Подскажите, кто знает, пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2015, 17:12
Ответы с готовыми решениями:

boost::bind
CTCPClient::CTCPClient(std::string _host, int port) :socket_(io_service_) { ...

Присвоить значение возвращаемое boost::bind
Добой ночи. Хотелось бы знать, как присвоить значение, возвращаемое boost::bind. Есть...

boost::bind прекращение работы программы microsoft optimizing compile
Всем привет! При компилирование выскакивает окошко с надписью "прекращение работы программы...

Boost::asio::ip::udp::socket bind а мне нужен не локальный хост
Здравствуйте. Пытаюсь наладить для своих нужд пример #include <iostream> #include <string>...

Boost начало работы: Undefined reference to `boost::system::generic_category() '
Добрый день Собственно говоря возникла необходимость использовать boost в работе. Поставил так: ...

4
DiffEreD
1444 / 781 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.01.2015, 17:49 2
Вообщем так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <boost/bind.hpp>
 
 
int A1 = 40;
int B1 = 40;
 
bool func(int a, int b) { return (a == A1) && (b == B1); }
 
int main()
{
   std::vector<int> v{0,1,2,3,40,40,41,41,5};
   auto it = std::adjacent_find(v.begin(), v.end(), boost::bind(func, _1, _2));
   std::copy(v.begin(), it, std::ostream_iterator<int>(std::cout, " "));
}
Добавлено через 8 минут
Цитата Сообщение от John Prick Посмотреть сообщение
И никаких подходящих примеров
Плохо искал: Boost.Bind
2
hoggy
Эксперт С++
7002 / 3214 / 658
Регистрация: 15.11.2014
Сообщений: 7,354
Завершенные тесты: 1
30.01.2015, 19:14 3
Лучший ответ Сообщение было отмечено John Prick как решение

Решение

я так понял, вы просто хотите понять принцип изготовления каскадного бинда?

http://rextester.com/LMIQ29737

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//Title of this code
//Compiler Version 18.00.21005.1 for x86
 
#include <functional>
#include <algorithm>
#include <vector> 
#include <iostream>
 
#include "boost/bind.hpp"
 
using namespace std;
 
 
const int A1 = 3;
const int B1 = 4;
    
const int A2 = 4;
const int B2 = 5;
 
 
//---- по условию задачи нельзя использовать эти функции:
 
//bool func1(int a, int b) { return (a == A1) && (b == B1); }
//bool func2(int a, int b) { return (a == A2) && (b == B2); }
//bool func(int a, int b) { return func1(a, b) || func2(a, b); }
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    int data[] = {1, 2, 3, 4, 5, 6, 7, 8};
    const size_t len= sizeof(data)/sizeof(data[0]);
    vector<int> cont(data, data + len);
    
    //---------------------------------------------------------
    
    // простейшие бидны. 
    // bindA1(30) эквавелентно [](int v) { return v==A1; };
    // c остальными аналогично
    auto bindA1 = boost::bind( std::equal_to<int>(), _1, A1);
    auto bindA2 = boost::bind( std::equal_to<int>(), _1, A2);
    auto bindB1 = boost::bind( std::equal_to<int>(), _1, B1);
    auto bindB2 = boost::bind( std::equal_to<int>(), _1, B2);
    
    std::cout << "is 30 == A1 ? " << bindA1(30)<<'\n';
    
    // каскандный бинд из двух этажей
    auto kaskade = boost::bind(
        std::logical_and<int>(), 
            boost::bind( std::equal_to<int>(), _1, A1),
            boost::bind( std::equal_to<int>(), _2, B1)
    );
    // kaskade(10,20) эквивалентно: 
    //
    // std::logical_and<int>(  
    //        (std::equal_to<int>(10), A1), 
    //        (std::equal_to<int>(20), B1) 
    // );
    // плейс холдеры _1 и _2 от родителя передаются вглубину вложенным биндам
    //
    
    std::cout << "is 3 == A1 and 4 == B1 ? " << kaskade(3,4)<<'\n';
    std::cout << "is 1 == A1 and 1 == B1 ? " << kaskade(1,1)<<'\n';
    
    //теперь делаем каскадный бинд с ещё одним уровнем вложенности:
    
    auto mybind = boost::bind(
        
        std::logical_or<int>(), 
        
            boost::bind(
                std::logical_and<int>(), 
                    boost::bind( std::equal_to<int>(), _1, A1),
                    boost::bind( std::equal_to<int>(), _2, B1)
                ),
        
            boost::bind(
                std::logical_and<int>(), 
                    boost::bind( std::equal_to<int>(), _1, A2),
                    boost::bind( std::equal_to<int>(), _2, B2)
                )
    );
   
    std::cout << "is (4 == A1 and 5 == B1) || (4 == A2 and 5 == B2) ? " << mybind(4,5)<<'\n';
    
    //-------------------------------------------------------------
    // ну а теперь решение вашей задачи:
    
    auto it = std::adjacent_find(cont.begin(), cont.end(), mybind);
    
    if (it!=cont.end()) 
        cout<< "Found: "<< *it <<'\n';
    else 
        cout<<"No elements";
 
}
3
gray_fox
What a waste!
1558 / 1263 / 166
Регистрация: 21.04.2012
Сообщений: 2,642
Завершенные тесты: 3
30.01.2015, 22:59 4
Лучший ответ Сообщение было отмечено John Prick как решение

Решение

Там есть перегруженные операторы
C++
1
2
3
4
(boost::bind(std::equal_to<int>(), _1, A1)
            && boost::bind(std::equal_to<int>(), _2, B1))
       || (boost::bind(std::equal_to<int>(), _1, A2)
            && boost::bind(std::equal_to<int>(), _2, B2))
хотя всё равно громоздко.
2
John Prick
839 / 770 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
Завершенные тесты: 3
31.01.2015, 11:51  [ТС] 5
DiffEreD, твой пример мне понятен, но он слишком прост. Посмотри код в моём первом сообщении, там всё-таки посложнее задачка.
Цитата Сообщение от hoggy Посмотреть сообщение
я так понял, вы просто хотите понять принцип изготовления каскадного бинда?
Да, совершенно верно. Я даже сам попытался сделать то, что хочу, и у меня "это" даже скомпилировалось, но выполняется неправильно.

В общем, кое-что прояснилось. Спасибо всем! Будут вопросы - напишу ещё.
0
31.01.2015, 11:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2015, 11:51

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include &lt;boost/log/trivial.hpp&gt; int main(int,...

Использование boost и boost.build с несколькими компиляторами
Здравствуйте! Собрал библиотеку boost и boost.build для двух компиляторов: MinGW 4.5.2 и Visual...

Метапрограммирование в boost::proto (boost::spirit)
В библиотеке boost:: proto есть такой код calculator&lt;proto::terminal&lt;placeholder&lt;0&gt; &gt;::type&gt;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru