979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
1 | ||||||
binder316.07.2013, 20:35. Показов 1198. Ответов 18
Метки нет (Все метки)
Здорова!
Есть задачка: "Напишите связывающий адаптер binder3(), который должен связывать второй и третий аргументы трехаргументной функции для получения унарного предиката. Приведите пример полезного применения binder3()." Ни как не пойму как вернуть из функции указатель на функцию. binder3 как я понимаю должна вернуть указатель на функцию. Как мне определение написать binder3 ???
0
|
138 / 130 / 59
Регистрация: 13.12.2012
Сообщений: 293
|
||||||
16.07.2013, 21:41 | 2 | |||||
Указатель на функцию, которая принимает 2 int'а и возвращает bool, вот так
0
|
16.07.2013, 21:51 | 3 |
a) binder это не функция, это адаптер. Для "Гуру С++" поясняю - в общем случае это класс с перегруженным оператором ().
б) он не должен ничего возвращать. Посмотри на реализацию чего-нибудь типа binder2nd. А, если говорить о функции, то посмотри bind2nd.
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
16.07.2013, 23:16 [ТС] | 4 | |||||
Kastaneda, мне нужно сделать что бы так было есть допустим функция bool f(int a,int b){return (a<b);} и когда я ее передаю в binded3(f,6,7), то она б наверно делала из этой функции одноаргументную bool f(int a){return (a<7);}
Ну что то вроде binder2nd токо третий аргумент можно куда то прилепить можно такую функцию вернуть bool f(int a){return (a*6<7);} что нибудь придумать. Как это токо сделать????? Добавлено через 1 минуту Ладно есть идея как это сделать. Щас попробую мб получится. Добавлено через 16 минут Ничо не работает, ладно нужно сделать такую же фигню как binder2
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
17.07.2013, 00:00 [ТС] | 6 |
Да посмотрел, там просто оказывается инициализируешь объект, передаешь в алгоритм, в объекте operator перегружен который принимает один аргумент, и вызывает сохраненную функцию с двумя параметрами.
Оказалось вроде просто, а от смогу ли я шаблон написать щас попробую.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
17.07.2013, 00:04 | 7 |
стандартные биндеры старого стандарта достаточно уродские.
если цель - не написать велосипед, то: в новом стандарте есть лябмды и std::bind если все в пределах старого стандарта, то тут или написать предикат (класс с operator ()) и правильно его сконструировать или boost::bind.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
17.07.2013, 00:06 [ТС] | 8 | |||||
От красота правдаж???
DU, Да правильно угадал .
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
17.07.2013, 00:13 [ТС] | 10 | |||||
Да осилил от красавчик:
0
|
Каратель
|
|
17.07.2013, 00:15 | 11 |
почему параметры имеют одинаковый тип?
почему тип результата bool ? почему там жеско прописан указатель на функцию?
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
17.07.2013, 00:33 [ТС] | 12 | |||||
Там забыл добавить С
Потому что функция передается с двумя одинаковыми параметрами От щас как раз пытаюсь для функциональных объектов как то перегрузить конструктор, но чото ничего не получается. Добавлено через 10 минут Jupiter, От для функциональных объектов все вроде работает.
Добавлено через 1 минуту Да шаблоны тяжело писать.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
17.07.2013, 00:35 | 13 | |||||
вот мой велосипедик:
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
17.07.2013, 00:48 [ТС] | 14 |
DU, молодец шариш.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
17.07.2013, 00:50 | 15 | |||||
если забить на адаптируемость такого предиката, то можно пойти дальше и сделать шаблонным operator ()
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
17.07.2013, 10:06 | 17 | |||||
С поддержкой функций обычных (чем кстати не занимется ни bind2nd, ни bind1st) будет менее симпатично.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
17.07.2013, 10:10 | 18 |
биндер 3 делается по аналогии. еще нужно от захардкоженного типа возвращаемого значения избавится, которое можно выводить либо внутри самого биндера3, либо в make функции, либо задавать явно.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
17.07.2013, 11:10 | 19 | |||||
DU,
Один из интересных вариантов - использовать boost::function_types
1
|
17.07.2013, 11:10 | |