Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/39: Рейтинг темы: голосов - 39, средняя оценка - 4.87
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
1

std::bind

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

Можно ли, и если да, то как с помощью этой функции сделать следующее:
C++
1
2
3
4
auto var=std::bind(&f, "arg");
//...
//...
//тут надо из var вызвать f("arg")
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2012, 21:08
Ответы с готовыми решениями:

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::cref() и std::bind()?
В документации не понял, что делает bind() ? И чем отличается cref() от операции взятия адреса? ...

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

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

Добавлено через 2 минуты
Другой вопрос: какой тип имеет var и меняется ли он при изменении аргументов, передаваемых bind?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.07.2012, 21:22 4
Shandr_71, var имеет не суть какой тип, там какой-то нереальный) Да меняется.
0
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:24  [ТС] 5
А есть ли какие-то другие стандартные/нет функции, чтобы var всегда имел один тип?
0
Higher
1944 / 1210 / 120
Регистрация: 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
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:29  [ТС] 7
Мне нужно средство для вызова функций (аргументы у всех могут быть разные) в определенном месте (как у меня с var).
0
2551 / 1316 / 177
Регистрация: 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
бжни
2467 / 1676 / 135
Регистрация: 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
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.07.2012, 21:40 10
Кстати вчера интересеная фишка на тему bind-а была http://stackoverflow.com/quest... rap-functi
0
2551 / 1316 / 177
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2012, 22:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

Проверить объект в std::bind на живучесть
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;functional&gt; using namespace std; typedef...

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


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

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

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