Форум программистов, компьютерный форум CyberForum.ru

Непонятки с bind2nd - C++

Восстановить пароль Регистрация
 
xSCJx
22 / 19 / 1
Регистрация: 24.12.2012
Сообщений: 435
26.08.2013, 17:13     Непонятки с bind2nd #1
Привет. Вот к примеру есть такой код:
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
#include <algorithm>  
#include <functional>   
#include <iostream>       
#include <array>       
  
class multip : public std::binary_function<int, int, void>
{
public:
    void operator()(int val, int to) const {
        std::cout << (val *= to) << std::endl;
    }
 
};
 
int main () 
{
    std::array<int, 5> a = { 1, 2, 3, 4, 5 };
 
    std::for_each(a.begin(), a.end(), std::bind2nd(multip(), 2));
 
    //std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, " "));
    
    system("PAUSE");
    return 0;
}
почему, если убрать const в операторе(), код не будет работать?
И еще, должен быть объязательно функтор? Обычную функцию с bind2nd, использовать нельзя?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2013, 17:13     Непонятки с bind2nd
Посмотрите здесь:

C++ bind1st и bind2nd
C++ непонятки
Непонятки с чаром C++
C++ Отличие bind2nd от binder2nd
C++ непонятки с for
C++ Ошибка номер c2535 в адапторе bind2nd
C++ Использование bind2nd
C++ Забиндить второй аргумент функции, используя std::bind2nd

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.08.2013, 17:38     Непонятки с bind2nd #2
Цитата Сообщение от SERUYBKR Посмотреть сообщение
почему, если убрать const в операторе(), код не будет работать?
Потому что функция bind2nd первым параметром принимает константную ссылку.
C++
1
2
template <class Operation, class T>
  binder2nd<Operation> bind2nd (const Operation& op, const T& x);
Соответственно, вызов неконстантной функции повлечет за собой discard qualifier.

Цитата Сообщение от SERUYBKR Посмотреть сообщение
И еще, должен быть объязательно функтор? Обычную функцию с bind2nd, использовать нельзя?
Можно, надо только обернуть функцию в функтор. Например, с помощью функции
C++
1
2
3
4
5
template <class Arg, class Result>
  pointer_to_unary_function<Arg,Result> ptr_fun (Result (*f)(Arg));
 
template <class Arg1, class Arg2, class Result>
  pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun (Result (*f)(Arg1,Arg2));
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void some(int val, int to) {
  std::cout << (val *= to) << std::endl;
}
 
 
int main () 
{
    int a[] = { 1, 2, 3, 4, 5 };
 
    std::for_each(a, a + 5, std::bind2nd(std::ptr_fun(some), 2));
 
    //std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, " "));
    
    //system("PAUSE");
    return 0;
}
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.08.2013, 17:59     Непонятки с bind2nd #3
SERUYBKR, желательно вместо std::bind2nd использовать std::bind, т.к. std::bind2nd является устаревшим методом
Yandex
Объявления
26.08.2013, 17:59     Непонятки с bind2nd
Ответ Создать тему
Опции темы

Текущее время: 20:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru