3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
1

Забиндить второй аргумент функции, используя std::bind2nd

08.10.2014, 01:32. Показов 1795. Ответов 8
Метки нет (Все метки)

Как забиндить свою функцию с двумя аргументами в функцию с одним аргументом? Вот пример в котором нужно сделать для b:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <functional>
 
int minus(int a,int b) {
    return a-b;
}
 
int main() {
 
    int a = std::minus<int>()(3,1); // использование STL minus
    int b = minus(3,1);             // использование minus
 
    a = std::bind2nd(std::minus<int>(),5)(10); // забиндить второй аргумент std::minus на число 5
    //b = std::bind2nd(minus,5)(10);             // забиндить второй аргумент minus на число 5
    
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2014, 01:32
Ответы с готовыми решениями:

std::setw() как аргумент функции
void print(const int format = 0) const { for (size_t i = 0; i&lt;m_rows; ++i) { ...

Зачем передаётся второй аргумент функции date?
Привет пацаны. Ниже пример не могу понять что означает $date Вот ниже пример function...

Используя условие Коши-Римана, найти модуль и аргумент производной от аналитической функции.
Используя условие Коши-Римана найти модуль и аргумент в заданной точке производной от аналитической...

Забиндить функцию и параметром-ссылкой не используя С++11
здравствуйте, есть такой код: struct CPack { void Save(TiXmlElement&amp; element) {} }; int...

8
_Ivana
08.10.2014, 01:43
  #2

Не по теме:

Так это и есть С++ ные лямбды? Пишут, что это не настоящее частичное применение, а создание компилятором копии за кадром. Но зато по второму аргументу биндит тоже, а не только по первому каррирует.

0
BlackUser
08.10.2014, 01:57  [ТС]
  #3

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
лямбды
Вот лямбда для c++11:
C++
1
int b = [](int arg) { return arg-5; }(10);
, но мне нужно забиндить

0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
08.10.2014, 09:35 4
Лучший ответ Сообщение было отмечено BlackUser как решение

Решение

Для этого в bind2nd нужно передавать функтор:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <functional>
 
struct minus : public std::binary_function<int, int, int>
{   
  int operator()(const int& left, const int& right) const
    {   
      return (left - right);
    }
};
 
 
int main() {
 
    int a = std::minus<int>()(3,1); // использование STL minus
    int b = minus()(3,1);             // использование minus
 
    a = std::bind2nd(std::minus<int>(),5)(10); // забиндить второй аргумент std::minus на число 5
    b = std::bind2nd(minus(),5)(10);             // забиндить второй аргумент minus на число 5
    
    return 0;
}
3
Эксперт по математике/физикеЭксперт С++
1995 / 1325 / 379
Регистрация: 16.05.2013
Сообщений: 3,430
Записей в блоге: 6
08.10.2014, 10:27 5
Лучший ответ Сообщение было отмечено BlackUser как решение

Решение

BlackUser, внимательно изучайте конверторы STL.
C++
1
    b = std::bind2nd(std::ptr_fun(minus),5)(10);
4
3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
08.10.2014, 10:43  [ТС] 6
Цитата Сообщение от Ilot Посмотреть сообщение
внимательно изучайте конверторы STL
Спасибо огромное. Это то, что я искал. Можете еще подсказать. Можно ли забиндить функцию с 1 параметром в функцию без параметров. Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int foo(int arg) {
    return 1 + arg*2;
}
 
int main() {
 
    int a = foo(3);
 
    //int b = bar();
    
    return 0;
}
Например нужно, чтобы при вызове bar() вызывалась foo с параметром 3. Есть к примеру std::generate(..., ..., ..., bar);
где bar на самом деле это foo с параметром 3. И желательно в стандарте c++98? ,без с++11, если это возможно.
0
Эксперт по математике/физикеЭксперт С++
1995 / 1325 / 379
Регистрация: 16.05.2013
Сообщений: 3,430
Записей в блоге: 6
08.10.2014, 11:08 7
Цитата Сообщение от BlackUser Посмотреть сообщение
Можно ли забиндить функцию с 1 параметром в функцию без параметров.
В С++98 насколько мне известно нет.
1
В астрале
Эксперт С++
8045 / 4802 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.10.2014, 12:10 8
Лучший ответ Сообщение было отмечено BlackUser как решение

Решение

BlackUser, boost::bind. Или сами напишите нечто подобное.
1
3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
09.10.2014, 02:28  [ТС] 9
Цитата Сообщение от ForEveR Посмотреть сообщение
boost::bind
То, что нужно. Но кое-что все равно не выходит. Как забиндить второй(и, возможно, третий, четвертый) аргументы, оставив возможность подстановки аргумента 1. Забиндить все аргументы, забиндить только второй аргумент, поменять местами аргументы, выходит, а вот забиндить только второй и последующие, не тронув первый невыходит. Вот пример составил, мне нужно для result_5 и result_6. Я предположил как, но ничего не вышло, не подскажите как? Возможно даже чем-нибудь отличным от boost:bind

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <boost/bind/bind.hpp>
 
int foo(int arg1, int arg2) {
    return arg1+arg2*2;
}
 
int main() {
 
    int result_1 = boost::bind(foo, _1, _2)(1,2); // всеравно, что просто bar(1,2);
 
    int result_2 = boost::bind(foo, _2, _1)(1,2); // поменяли местами: всеравно, что просто bar(2,1);
 
    int result_3 = boost::bind(foo, _2, _1)(1,2); // поменяли местами: всеравно, что просто bar(2,1);
 
    int result_4 = boost::bind(foo, _1, 2)(1); // теперь второй параметр всегда 2
 
    //int result_5 = boost::bind(foo, 1, _2)(2); // теперь первый параметр всегда 1
 
    //int result_6 = boost::bind(foo,_2, 1)(2); // теперь первый параметр всегда 1
 
    return 0;
}
upd: как же я раньше не додумался, решение совсем простое(но возможно не самое элегантное)
C++
1
boost::bind(boost::bind(foo,_2,_1),_1,1)(2);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2014, 02:28
Помогаю со студенческими работами здесь

Используя тип TStack, описать функции StackIsEmpty(S) и Peek(S), а также Pop (std::stack)
Дан указатель на вершину стека. Используя тип TStack, описать функции StackIsEmpty(S) логического...

std::function любой аргумент
std::function&lt; ()&gt; generic_priner = (..){ return .. }; Как сделать так что бы...

Std::sort - 3 аргумент другая функция
Здравствуйте. Так все работает //вызывается из наследника sort(group.begin(), group.end(), (...

Как забиндить данные ListView.ItemTemplate используя Binding, а не x:Bind
Так работает: &lt;ListView.ItemTemplate&gt; &lt;DataTemplate...

Найти предел функции, используя первый и второй замечательные пределы
Найти предел функции, используя первый и второй замечательные пределы.

Где в настройках RAD Studio 10 Seattle изменить аргумент на -std=c99?
ребята, где в настройках RAD Studio 10 Seattle изменить аргумент на -std=c99 , что бы компилятор не...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru