powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по bind
25 сообщений из 46, страница 1 из 2
Вопрос по bind
    #38549255
Фотография Духовные скрепы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю книжку по STL и в одном месте конкретно затупил:
Binding to Data Members
You can also bind to data members. Consider the following example (namespaces omitted):4
Код: plaintext
1.
2.
3.
4.
5.
map<string,int> coll; // map of int values associated to strings
...
// accumulate all values (member second of the elements)
int sum
= accumulate (coll.begin(), coll.end(), 0, bind(plus<int>(), _1, bind(&map<string,int>::value_type::second, _2)));


Here, accumulate() is called, which uses a binary predicate to sum up all values of all elements
(see Section 11.11.1, page 623). However, because we use a map, where the elements are key/value
pairs, to gain access to an element’s value
Код: plaintext
1.
bind(&map<string,int>::value_type::second,_2)


binds the passed second argument of each call of the predicate to its member second.


Что делает вот это вот
Код: plaintext
1.
bind(&map<string,int>::value_type::second, _2)

и как оно это делает?
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549273
Фотография Духовные скрепы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё вопрос, такой код:
Код: plaintext
1.
2.
3.
4.
5.
int count=0; // call counter
pos = remove_if(coll.begin(),coll.end(), // range
    [count] (int) mutable { // remove criterion
        return ++count == 3;
    });



тут count копируется? Если да то зачем mutable?
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549300
Фотография Духовные скрепы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
со вторым вопросом разобрался, из лямбды генерируется
Код: plaintext
1.
bool operator ()(int) const

.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549444
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Духовные скрепыЧто делает вот это вот
Код: plaintext
1.
bind(&map<string,int>::value_type::second, _2)


и как оно это делает?
Это специальный вид bind'а, работающий с указателем на поле класса, а не с функцией. См. ниже.

Вообще исходное выражение
Код: plaintext
1.
accumulate (coll.begin(), coll.end(), 0, bind(plus<int>(), _1, bind(&map<string,int>::value_type::second, _2)));


совмещает две следующие техники работы с bind:
Код: plaintext
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.
struct S {
    int a;
};
S s = { 10 };

int func1(int x,int y) { return x + y; }
int func2(int y) { return y; }

int main()
{

    // Первый специальный вид bind: bind(указатель_на_поле_класса, экземпляр класса)
    // Возвращает функтор принимающий аргументом указатель/ссылку на экземпляр класса,
    // и возвращающий значение забайнденного поля для этого экземпляра
    auto f1 = bind(&S::a, _1);
    cout << f1(&s) << endl;  // return s->a; //10

    // Второй специальный вид bind:  bind(funс, _1, _2, bind(..._1, _2)) - когда аргумент который байндится
    // к функции, является тоже bind'ом, забайнденным к тому же набору плейсхолдеров
    // (_1, _2... любые из них)
    // Возвращает функтор, который принимает указанное число аргументов и вычисляет
    // все функторы вложенных bind'ов с помощью этих же аргументов
    auto f2 = bind(func1, _1, bind(func2, _2));
    cout << f2(10/*_1*/, 20/*_2*/) << endl; // return func1(10, func2(20)); //30

    return 0;
}



Подробнее может Mozok рассказать. Он знает толк
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549503
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Духовные скрепы,

как бы теперь эту всю хрень можно не изучать - с лямбдами это все делается проще.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549513
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivкак бы теперь эту всю хрень можно не изучать - с лямбдами это все делается проще.
Пока еще не все .
Вот когда лямбды будут поддерживать move-семантику для замыкания (С++14) вот тогда будет все :)

ЗЫ. Хотя, синтаксис, которым предлагается делать перемещающий захват переменных в С++14 - тот еще по легкости и ясности. Я бы лучше с помощью bind продолжал бы :)
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549528
Фотография Духовные скрепы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот когда лямбды будут поддерживать move-семантику для замыкания (С++14) вот тогда будет все :)
ЗЫ. Хотя, синтаксис, которым предлагается делать перемещающий захват переменных в С++14 - тот еще по легкости и ясности.

Можно пример move-семантики для замыкания у лямбд в C++14?
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549539
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот когда лямбды будут поддерживать move-семантику для замыкания (С++14) вот тогда будет все :)
Упс. И тогда еще не все будет :)

Вот такое не знаю вообще как лямбдами сделать.
Код: plaintext
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.
void callback1(const boost::system::error_code& ec, size_t bytes_transferred)
{
}
void callback2(size_t bytes_transferred, const boost::system::error_code& ec)
{
}
void callback3(const boost::system::error_code& ec)
{
}

int main()
{

    // клиент некого АПИ
    auto f1 = bind(callback1, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred);
    auto f2 = bind(callback2, boost::asio::placeholders::bytes_transferred, boost::asio::placeholders::error);
    auto f3 = bind(callback3, boost::asio::placeholders::error);

    // реализация этого АПИ
    boost::system::error_code ec;
    size_t bytes_transferred = 0;
    f1(ec, bytes_transferred);
    f2(ec, bytes_transferred);
    f3(ec, bytes_transferred);

    return 0;
}


Фишка в том, что клиент некой библиотеки передает туда колбэки с произвольным набором и порядком аргументов (из набора поддерживаемых библиотекой).
При этом клиент не обязан знать все поддерживаемые параметры и в каком порядке их указывать. А библиотека в свою очередь не обязана знать порядок аргументов указанный клиентом чтобы вызвать колбэк.
В итоге библиотека может развиваться (добавлять новые параметры) без необходимости переписывать существующих клиентов. А клиент может получать только те параметры, которые ему интересны.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549548
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Духовные скрепыМожно пример move-семантики для замыкания у лямбд в C++14?
Например если у нас есть переменная capture_var и мы хотим ее переместить при захвате, то будет так:
Код: plaintext
1.
[ capture_var{std::move(capture_var)} ] { use(capture_var); } 



Эта фича называется обобщенный захват (generalized lambda capture).
Внутри capture_var{...} можно указывать любое выражение допустимое при инициализации переменных.
В данном случае это std::move().
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549550
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для сравнения, то же самое через bind:
Код: plaintext
1.
auto f = bind(&use, std::move(capture_var));
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549552
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. use - это ключевое слово. Если вы хотите протестить этот код вам надо переименовать эту функцию (не говоря уже о том что создать ее) :)
...
Рейтинг: 0 / 0
Вопрос по bind
    #38549553
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyPS. use - это ключевое слово. Если вы хотите протестить этот код вам надо переименовать эту функцию (не говоря уже о том что создать ее) :)
А не, отбой. Это using ключевое слово, а use - нет :)
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550030
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот тред уронил больно ударил по моей самооценке. И что, все эти ужасы реально используются в ваших проектах и на собеседованиях спрашиваются?
Коли так, то я совсем отстал от жызни оО т.к. вообще не юзаю не то что bind/STL, но даже шаблоны :)
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550066
Фотография Духовные скрепы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex the coderИ что, все эти ужасы реально используются в ваших проектах и на собеседованиях спрашиваются?

В моих проектах ещё не используются, но планирую начать использовать с весны, после заседания комитета где C++14 утвердят или не утвердят. GCC и CLang уже декларируют полную совместимость с C++14.
На собеседованиях у меня спрашивали про то что из boost использовал, а многое C++11 взял из boost. Конкретно про C++11 или STL из C++11 ещё не спрашивали, из C++03 спрашивали фсё. Полагаю, что скоро начнут и из C++11 спрашивать фсё.

Alex the coderКоли так, то я совсем отстал от жызни оО т.к. вообще не юзаю не то что bind/STL, но даже шаблоны :)

Ну, что сказать, кроме самого юзания этих вещей, которые ещё нужно освоить, нужно будет освоить где их нужно юзать и как правильно юзать.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550162
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Духовные скрепы, а не посоветуете опенсорсный проект, где можно подглядеть хорошие примеры использования новшеств C++11?
У меня-то в проекте запрещено использование что С++11, что буста. Да и вообще KISS во все поля :)
P.S. Помнится, в Акронисе были довольно простые тесты по С++. Меня скорее подвело незнание нужных паттернов.
Выходит, сейчас сложнее всё...
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550178
Фотография Духовные скрепы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex the coderне посоветуете опенсорсный проект, где можно подглядеть хорошие примеры использования новшеств C++11?

Вот здесь что-то пишут C++11, вроде нормально - https://github.com/cocaine/cocaine-core

Alex the coderВыходит, сейчас сложнее всё...

Зависит от размера хотелки денег, на 80 тыр. одни вопросы, на 120 тыр. уже другие.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550210
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Духовные скрепы, о, слышал об этом проекте Яндекса. Там так понимаю ерунды не пишут :) Спасибо.

Насчёт собеседований - от меня и на 80к требовали глубокие знания STL, алгоритмов и прочий компутерсайнс, а я только на одном Qt быдлокодю :/ Хотя с нюансами самого С++ справляюсь сносно.
Выходит, надо развиться до требуемого уровня самостоятельно и только потом искать работу, т.к. ни разу тут не видел вакансий С++-джуниоров.
И простите за оффтоп в Вашей теме. Наболело что-то. Вроде и работаю не первый год, а востребованность только падает, навыки забываются. Вот тебе и "интересные задачи"(с)
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550225
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Духовные скрепы, кстати одно время писал эпические вложенные boost::bind'ы - ну когда нужно было хитрым образом извлечь инфу их одного контейнера, напустить на нее определенный обработчик и положить в другой. В итоге меня обругали и заставили писать всё это более очевидным образом :) сейчас уже успешно забыл вообще как bind работает.
У Вас случаем нет неких правил на тему "читабельности" bind-кода? аля "не допускать вложенности больше третьего уровня".
Хотя лямбды конечно здорово спасают ситуацию.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550227
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex the coderДуховные скрепы, о, слышал об этом проекте Яндекса. Там так понимаю ерунды не пишут :) Спасибо.

Насчёт собеседований - от меня и на 80к требовали глубокие знания STL, алгоритмов и прочий компутерсайнс, а я только на одном Qt быдлокодю :/ Хотя с нюансами самого С++ справляюсь сносно.
Выходит, надо развиться до требуемого уровня самостоятельно и только потом искать работу, т.к. ни разу тут не видел вакансий С++-джуниоров.
И простите за оффтоп в Вашей теме. Наболело что-то. Вроде и работаю не первый год, а востребованность только падает, навыки забываются. Вот тебе и "интересные задачи"(с)

Да, сейчас вообще как-то с требованиями к С++-никам всё неадекватно. Вернее, с требованиями -- адекватно, они ХОТЯТ, а вот с отдачей от этого как-то хуже -- они НЕ МОГУТ.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550309
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, кстати может подскажете - а новые проекты вообще на плюсах пишут? У меня-то впечатление, что в основном требуется разгребать авгиевы конюшни.
Я сейчас на новом проекте как раз, чем эта работа и подкупила - но с другой стороны, слишком уж узкая специализация (только Qt). Как-то очень не хочется снова идти разгребать чужой, эм, не очень хороший и недокументированный код.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550323
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex the coderMasterZiv, кстати может подскажете - а новые проекты вообще на плюсах пишут? У меня-то впечатление, что в основном требуется разгребать авгиевы конюшни.
Я сейчас на новом проекте как раз, чем эта работа и подкупила - но с другой стороны, слишком уж узкая специализация (только Qt). Как-то очень не хочется снова идти разгребать чужой, эм, не очень хороший и недокументированный код.

Я знаю, что кто-то что-то пишет.
Но я не центр вселенной.

У нас в нашей стране вообще IT всё сильно смещено в сторону эксплуатации ПО, разработки прикладного ПО.
Разработка системных компонент и средств производства у нас как-то не очень развита.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550479
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex the coderЭтот тред уронил больно ударил по моей самооценке. И что, все эти ужасы реально используются в ваших проектах и на собеседованиях спрашиваются?
Коли так, то я совсем отстал от жызни оО т.к. вообще не юзаю не то что bind/STL, но даже шаблоны :)
Я пока фичи С++11 не использую в продакшен проектах.
Буст - использую по полной программе.
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550485
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Духовные скрепы
Код: plaintext
1.
2.
3.
4.
5.
map<string,int> coll; // map of int values associated to strings
...
// accumulate all values (member second of the elements)
int sum
= accumulate (coll.begin(), coll.end(), 0, bind(plus<int>(), _1, bind(&map<string,int>::value_type::second, _2)));


Извращения с биндами конечно интересные, но по моему любой из следующих вариантов гораздо понятней :)
Код: plaintext
1.
2.
3.
4.
5.
map<string,int> coll; // map of int values associated to strings
...
// accumulate all values (member second of the elements)
int sum
= accumulate (coll.begin(), coll.end(), 0, [](int const& sum, decltype(coll)::value_type const& mval2) { return sum + mval2.second; } );


или
Код: plaintext
1.
2.
3.
4.
5.
map<string,int> coll; // map of int values associated to strings
...
// accumulate all values (member second of the elements)
int sum = 0;
for(auto &i : coll) sum += i.second;  // accumulate
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550496
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex the coderа новые проекты вообще на плюсах пишут? У меня-то впечатление, что в основном требуется разгребать авгиевы конюшни.
Пишут-пишут.
Alex the coderКак-то очень не хочется снова идти разгребать чужой, эм, не очень хороший и недокументированный код
Чужой код всегда плохой и недокументированный :)
...
Рейтинг: 0 / 0
Вопрос по bind
    #38550512
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

Mozok бы с вами поспорил :)
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по bind
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]