Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по bind / 25 сообщений из 46, страница 1 из 2
04.02.2014, 19:01
    #38549255
Духовные скрепы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Читаю книжку по 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
04.02.2014, 19:10
    #38549273
Духовные скрепы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
И ещё вопрос, такой код:
Код: 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
04.02.2014, 19:31
    #38549300
Духовные скрепы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
со вторым вопросом разобрался, из лямбды генерируется
Код: plaintext
1.
bool operator ()(int) const

.
...
Рейтинг: 0 / 0
04.02.2014, 22:23
    #38549444
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Духовные скрепыЧто делает вот это вот
Код: 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
04.02.2014, 23:54
    #38549503
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Духовные скрепы,

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

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

Можно пример move-семантики для замыкания у лямбд в C++14?
...
Рейтинг: 0 / 0
05.02.2014, 01:00
    #38549539
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
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
05.02.2014, 01:07
    #38549548
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Духовные скрепыМожно пример 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
05.02.2014, 01:10
    #38549550
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Для сравнения, то же самое через bind:
Код: plaintext
1.
auto f = bind(&use, std::move(capture_var));
...
Рейтинг: 0 / 0
05.02.2014, 01:11
    #38549552
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
PS. use - это ключевое слово. Если вы хотите протестить этот код вам надо переименовать эту функцию (не говоря уже о том что создать ее) :)
...
Рейтинг: 0 / 0
05.02.2014, 01:13
    #38549553
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Anatoly MoskovskyPS. use - это ключевое слово. Если вы хотите протестить этот код вам надо переименовать эту функцию (не говоря уже о том что создать ее) :)
А не, отбой. Это using ключевое слово, а use - нет :)
...
Рейтинг: 0 / 0
05.02.2014, 12:34
    #38550030
Alex the coder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Этот тред уронил больно ударил по моей самооценке. И что, все эти ужасы реально используются в ваших проектах и на собеседованиях спрашиваются?
Коли так, то я совсем отстал от жызни оО т.к. вообще не юзаю не то что bind/STL, но даже шаблоны :)
...
Рейтинг: 0 / 0
05.02.2014, 12:51
    #38550066
Духовные скрепы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
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
05.02.2014, 13:31
    #38550162
Alex the coder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Духовные скрепы, а не посоветуете опенсорсный проект, где можно подглядеть хорошие примеры использования новшеств C++11?
У меня-то в проекте запрещено использование что С++11, что буста. Да и вообще KISS во все поля :)
P.S. Помнится, в Акронисе были довольно простые тесты по С++. Меня скорее подвело незнание нужных паттернов.
Выходит, сейчас сложнее всё...
...
Рейтинг: 0 / 0
05.02.2014, 13:39
    #38550178
Духовные скрепы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Alex the coderне посоветуете опенсорсный проект, где можно подглядеть хорошие примеры использования новшеств C++11?

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

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

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

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

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

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

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

У нас в нашей стране вообще IT всё сильно смещено в сторону эксплуатации ПО, разработки прикладного ПО.
Разработка системных компонент и средств производства у нас как-то не очень развита.
...
Рейтинг: 0 / 0
05.02.2014, 15:38
    #38550479
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Alex the coderЭтот тред уронил больно ударил по моей самооценке. И что, все эти ужасы реально используются в ваших проектах и на собеседованиях спрашиваются?
Коли так, то я совсем отстал от жызни оО т.к. вообще не юзаю не то что bind/STL, но даже шаблоны :)
Я пока фичи С++11 не использую в продакшен проектах.
Буст - использую по полной программе.
...
Рейтинг: 0 / 0
05.02.2014, 15:39
    #38550485
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Духовные скрепы
Код: 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
05.02.2014, 15:42
    #38550496
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Alex the coderа новые проекты вообще на плюсах пишут? У меня-то впечатление, что в основном требуется разгребать авгиевы конюшни.
Пишут-пишут.
Alex the coderКак-то очень не хочется снова идти разгребать чужой, эм, не очень хороший и недокументированный код
Чужой код всегда плохой и недокументированный :)
...
Рейтинг: 0 / 0
05.02.2014, 15:49
    #38550512
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по bind
Вася Уткин,

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


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