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

std::bind - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.65
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:08     std::bind #1
Можно ли, и если да, то как с помощью этой функции сделать следующее:
C++
1
2
3
4
auto var=std::bind(&f, "arg");
//...
//...
//тут надо из var вызвать f("arg")
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.07.2012, 21:12     std::bind #2
Если я вас правильно понял
C++
1
var();
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:18  [ТС]     std::bind #3
Спасибо, работет.

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

А есть ли какие-то другие стандартные/нет функции, чтобы var всегда имел один тип?
Не совсем понял вопрос, но если вас волнует, что если вы передадите другую строку, то при этом изменится тип, не волнуйтесь - такого не будет.
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
16.07.2012, 21:29  [ТС]     std::bind #7
Мне нужно средство для вызова функций (аргументы у всех могут быть разные) в определенном месте (как у меня с var).
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 21:32     std::bind #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?
Нет
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.07.2012, 21:39     std::bind #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'ов будут совпадать, мне кажется
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.07.2012, 21:40     std::bind #10
Кстати вчера интересеная фишка на тему bind-а была http://stackoverflow.com/questions/1...to-wrap-functi
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2012, 22:04     std::bind
Еще ссылки по теме:

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'| C++
C++ Проверить объект в std::bind на живучесть
C++ Разобраться с std::bind, плейсхолдеры

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.07.2012, 22:04     std::bind #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);
}
Если вы об этом говорили.
Yandex
Объявления
16.07.2012, 22:04     std::bind
Ответ Создать тему
Опции темы

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