Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Knjagskij
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
Завершенные тесты: 1
1

В чем отличия между std::cref() и std::bind()?

18.03.2016, 11:38. Просмотров 884. Ответов 6
Метки нет (Все метки)

В документации не понял, что делает bind() ?
И чем отличается cref() от операции взятия адреса?

C++
1
2
3
    int x;
    int *y = &x;
    cout << y << ' ' << cref(x);
Разные результаты
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2016, 11:38
Ответы с готовыми решениями:

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?

Как можно еще использовать std::placeholders вне в связки с std::bind?
Добрый день! Как можно еще использовать std::placeholders вне в связки с std::bind?

Почему std::string_view МЕДЛЕННЕЕ, чем std::string?
Всем привет! Нужно найти количество уникальных строк в больших текстовых файлах (размером до...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

6
yrceus
86 / 86 / 80
Регистрация: 25.08.2013
Сообщений: 338
18.03.2016, 12:20 2
bind(); привязка аргументов по ЗНАЧЕНИЮ
ref(); поправка для ССЫЛОЧНОГО аргумента
cref(); поправка для ссылки на КОНСТАНТУ
В качестве аргумента получает вызываемый объект(функцию) и возвращает новый вызываемый объект.
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
#include <iostream>
#include <functional>
#include <string>
using namespace std;
string fun(string &w, int x) {
    return w = w.substr(x);// копия строки начиная с позиции x
}
//--------------------------------------------------------
int main() {
    string str{ "Hello" };
    auto obj = bind(fun, str, placeholders::_1); // _1 это позиция единственного аргумента obj(int x)
                                                            //по исходной версии fun(string &w, int x)
    string ch = obj(2);// вызываем fun("Hello", 2), ch = "llo"
    cout << ch << " " << str << endl; //но str передалась по значению и не изменилось! А в fun(string &w, int x)
 
    // чтобы передать по ссылке
 
    auto obj2 = bind(fun, ref(str), placeholders::_1); //добавляем ref() к str
    string ch2 = obj2(1);
    cout << ch2 << " " << str << endl; // str изменилось
 
    // cref() задает ссылку но на константу
    return 0;
}
Добавлено через 5 минут
Прочитал тут - Липпман, Лажойе, Му - Язык программирования C++. Базовый курс (2014, 5-е издание) стр.508
1
Knjagskij
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
Завершенные тесты: 1
18.03.2016, 13:38  [ТС] 3
Не понятно, что значит привязка по значению и поправка ссылочного аргумента и ссылки.
Так же не разобрался с кодом, как мы в bind передаем аргументы?
0
yrceus
86 / 86 / 80
Регистрация: 25.08.2013
Сообщений: 338
18.03.2016, 13:59 4
bind(вызываемый объект(функция), параметры функции)
function(string a, int b, char c) простая функция с тремя параметрами
auto obj = bind(function, _1, 8, 'z'). obj может вызываться только с одним параметром int. Вызывая obj(3), мы вызываем function(3, 8, 'z'). Параметры 8 и 'z' привязались к объекту obj.
0
Knjagskij
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
Завершенные тесты: 1
18.03.2016, 14:03  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
MyClass::MyClass(QObject *parent) :
    QObject(parent)
{
    int a = 3;
    auto f = bind(func,placeholders::_1,3);
}
 
void MyClass::mainProcess()
{
 
}
 
void MyClass::my_slot()
{
 
}
 
int MyClass::func(int a, int b)
{
    cout << a << endl;
    return a;
}
А почему это не правильно?
C3867: 'MyClass::func': function call missing argument list; use '&MyClass::func' to create a pointer to member
0
yrceus
86 / 86 / 80
Регистрация: 25.08.2013
Сообщений: 338
18.03.2016, 14:11 6
Не смогу ответить, но вот примеры по bind();
C++
1
2
3
4
5
6
7
8
9
10
    string function(string &w, int x, char c); // простая функция
 
    auto obj = bind(function, "Hello", placeholders::_1, 'z');
    //вызов obj(3) эквивалентен вызову function("Hello", 3, 'z')
    
    auto obj1 = bind(function, "Hello", placeholders::_1, placeholders::_2);
    //вызов obj1(4, 'a') эквивалентен вызову function("Hello", 4, 'a')
 
    auto obj2 = bind(function, placeholders::_1, 8, 's');
    //вызов obj2("Word") эквивалентен вызову function("Word", 8, 's')
Аргументы привязываются к новому вызываемому объекту obj.

Я плохо еще разбираюсь в синтаксисе классов, но применение функции bind() понял.
0
Ilot
Эксперт С++
1854 / 1207 / 347
Регистрация: 16.05.2013
Сообщений: 3,190
Записей в блоге: 6
Завершенные тесты: 1
18.03.2016, 15:04 7
Цитата Сообщение от Knjagskij Посмотреть сообщение
А почему это не правильно?
C3867: 'MyClass::func': function call missing argument list; use '&MyClass::func' to create a pointer to member
Потому, что func это функция член:
C++
1
 auto f = bind(&MyClass::func, this,placeholders::_1,3);
0
18.03.2016, 15:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2016, 15:04

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы....

std::bind
Можно ли, и если да, то как с помощью этой функции сделать следующее: auto var=std::bind(&amp;f,...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.