Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.65
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
#1

std::bind - C++

16.07.2012, 21:08. Просмотров 6961. Ответов 10
Метки нет (Все метки)

Можно ли, и если да, то как с помощью этой функции сделать следующее:
C++
1
2
3
4
auto var=std::bind(&f, "arg");
//...
//...
//тут надо из var вызвать f("arg")
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2012, 21:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос std::bind (C++):

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

В чем отличия между std::cref() и std::bind()? - C++
В документации не понял, что делает bind() ? И чем отличается cref() от операции взятия адреса? int x; int *y = &x; ...

Передача std::bind в функцию - C++
Ребята, помогите разобраться с 28 строкой. Глубоко не копал, но должно ведь компилиться :) #include <iostream> #include <vector> ...

Разобраться с std::bind, плейсхолдеры - C++
Здравствуйте, чтобы разобраться с основами std::bind написал следующий код: #include <functional> #include <vector> void...

Std::bind с контролем типом - C++
В общем, нужно реализовать аналог std::bind, который 1. Переводит void (*callback)(Args...) в std::function<void()> 2. Если среди Args...

Проверить объект в std::bind на живучесть - C++
#include <iostream> #include <string> #include <functional> using namespace std; typedef std::function<int(string)> CALLBACK; ...

10
diagon
Higher
1936 / 1202 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.07.2012, 21:12 #2
Если я вас правильно понял
C++
1
var();
1
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:18  [ТС] #3
Спасибо, работет.

Добавлено через 2 минуты
Другой вопрос: какой тип имеет var и меняется ли он при изменении аргументов, передаваемых bind?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.07.2012, 21:22 #4
Shandr_71, var имеет не суть какой тип, там какой-то нереальный) Да меняется.
0
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:24  [ТС] #5
А есть ли какие-то другие стандартные/нет функции, чтобы var всегда имел один тип?
0
diagon
Higher
1936 / 1202 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.07.2012, 21:25 #6
Это зависит от компилятора.
В gcc это std::_Bind< void ( *(const char*) )(const char *)>
Если вы будете передавать объект типа std::string, то тип будет
std::_Bind< void ( *(const char*) )(std::string)>
В другом компиляторе будет по другому, это лишь реализация, и вникать в нее далеко не обязательно.

А есть ли какие-то другие стандартные/нет функции, чтобы var всегда имел один тип?
Не совсем понял вопрос, но если вас волнует, что если вы передадите другую строку, то при этом изменится тип, не волнуйтесь - такого не будет.
0
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:29  [ТС] #7
Мне нужно средство для вызова функций (аргументы у всех могут быть разные) в определенном месте (как у меня с var).
0
soon
2545 / 1310 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 21:32 #8
Цитата Сообщение от Shandr_71 Посмотреть сообщение
Другой вопрос: какой тип имеет var
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <functional>
#include <string>
 
void foo(const std::string& str)
{
    std::cout << str << std::endl;
}
 
int main()
{
    std::function<void()> var = std::bind(&foo, "str");
    var();
    return 0;
}
Цитата Сообщение от Shandr_71 Посмотреть сообщение
меняется ли он при изменении аргументов, передаваемых bind?
Нет
1
alex_x_x
бжни
2454 / 1660 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.07.2012, 21:39 #9
Цитата Сообщение от Shandr_71 Посмотреть сообщение
Другой вопрос: какой тип имеет var
A function object of unspecified type T, for which std::is_bind_expression<T>::value == true, and which can be stored in std::function
Цитата Сообщение от Shandr_71 Посмотреть сообщение
Мне нужно средство для вызова функций (аргументы у всех могут быть разные) в определенном месте (как у меня с var).
оно может быть сконвертировано в std::function фиксированного (из параметров и возвращаемого значения) типа

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 <random>
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
 
using namespace std::placeholders;
 
void f1 (std::ostream& os, int value) {
  os << value << std::endl;
}
 
void f2 (int) {
 
}
 
void use (std::function<void(int)> _f) {
   _f (3);
}
 
int main() {
  auto _f = std::bind(f1, std::ref(std::cout), _1);
  use (_f);
  use (f2);
}
Добавлено через 1 минуту
Цитата Сообщение от soon Посмотреть сообщение
Нет
то, что оно может конвертироваться в std::function одного типа не говорит о том, что типы bind'ов будут совпадать, мне кажется
1
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.07.2012, 21:40 #10
Кстати вчера интересеная фишка на тему bind-а была http://stackoverflow.com/questions/1...to-wrap-functi
0
soon
2545 / 1310 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 22:04 #11
Цитата Сообщение от alex_x_x Посмотреть сообщение
то, что оно может конвертироваться в std::function одного типа не говорит о том, что типы bind'ов будут совпадать, мне кажется
ИМХО, конвертироваться будут только тогда, когда возможны безболезненные преобразования между типами аргуметов. Иными словами
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
26
27
#include <random>
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
 
using namespace std::placeholders;
 
void f1 (std::ostream& os, int value) {
  os << value << std::endl;
}
 
void f2 (int) {
 
}
 
void use (std::function<void(int)> _f) {
   _f (3);
}
 
int main() {
  // std::function<void(const std::vector<int>&)> _f = std::bind(f1, std::ref(std::cout), _1);
  // Не пойдет
  std::function<void(const float&)> _f = std::bind(f1, std::ref(std::cout), _1); // OK
  // use (_f);
  // use (f2);
}
Если вы об этом говорили.
0
16.07.2012, 22:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2012, 22:04
Привет! Вот еще темы с ответами:

std::bind и указатель на статическую функцию член класса - C++
Биндинг простых функций класса-это понятно, а вот как быть, если функция статическая?

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'| - C++
Ругается на строку Log&lt;&lt;StripXML(__PRETTY_FUNCTION__)&lt;&lt;std::endl;. Функция такая: std::string StripXML ...

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

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


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

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

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