Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
33 / 33 / 18
Регистрация: 15.05.2013
Сообщений: 236
1

Передача std::bind в функцию

26.06.2017, 21:11. Просмотров 2272. Ответов 16
Метки нет (Все метки)


Ребята, помогите разобраться с 28 строкой. Глубоко не копал, но должно ведь компилиться

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <vector>
#include <string>
#include <functional>
 
void find_files(
    const std::string& absolute_path,
    const std::function<bool(const std::string& filename)> predicate,
    std::vector<std::string>& out_files);
 
 
int main() {
  std::cout << "Hello World!" << std::endl;
  auto is_needle_extension = [](const std::string& filename, const std::vector<std::string>& needle_extensions) -> bool {
   return false;
  };
 
  std::vector<std::string> headers;
  find_files("root_folder", [&](const std::string& filename) {
    return is_needle_extension(filename, {".h", ".hpp"});
  }, headers);
 
  auto is_needle = [](const std::string& filename) -> bool { return true; };
  find_files("root_folder", is_needle, headers);
 
 
  using std::placeholders::_1;
  //find_files("root_folder", std::bind(is_needle_extension, _1, {".h", ".hpp"}), headers);
 
 
 
  return 0;
}
 
void find_files(
    const std::string& absolute_path,
    const std::function<bool(const std::string& filename)> predicate,
    std::vector<std::string>& out_files) {
 
  const std::string filename = "1.txt";
  if (predicate(filename)) {
    out_files.emplace_back(filename);
  }
}
http://ideone.com/oFsDNx
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2017, 21:11
Ответы с готовыми решениями:

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

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() от операции взятия адреса? ...

16
Форумчанин
Эксперт CЭксперт С++
8164 / 5012 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
26.06.2017, 21:32 2
std::bind не нужен, вместо него используют лямбды. Начиная с С++14 не осталось ни одного кейза, где он был бы полезен.
1
Заблокирован
26.06.2017, 21:33 3
Лучший ответ Сообщение было отмечено Kant как решение

Решение

C++
1
std::bind(is_needle_extension, _1, std::vector<std::string>{".h", ".hpp"})
1
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
26.06.2017, 21:36 4
Убрал лишнее для вопроса - и сам не пойму почему нельзя забиндить заведомо известные аргументы
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
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <string>
#include <functional>
 
void find_files(
    const std::string& absolute_path,
    const std::function<bool( const std::string& filename )> predicate,
    std::vector<std::string>& out_files )
{
 
    const std::string filename = "1.txt";
    if( predicate( filename ) )
    {
        out_files.emplace_back( filename );
    }
}
 
 
int main()
{
    auto is_needle_extension = 
        []( const std::string& filename, const std::vector<std::string>& needle_extensions )
    {
        return false;
    };
 
    std::vector<std::string> out;
    find_files( "root_folder", std::bind( is_needle_extension, std::string("mySpecialFileName.txt"), {".h", ".hpp"} ), out );
 
 
 
    return 0;
}
0
nmcf
26.06.2017, 21:39
  #5

Не по теме:

Количество аргументов же разное.

0
33 / 33 / 18
Регистрация: 15.05.2013
Сообщений: 236
26.06.2017, 21:41  [ТС] 6
Меньше строк кода в некоторых местах. Возьми к примеру replace_if.
0
Каждому свое
530 / 216 / 81
Регистрация: 05.08.2013
Сообщений: 1,613
26.06.2017, 21:43 7
Kant, std :: bind создает объект - функцию, оболочку над функцией в виде объекта, так сказать.
find_files("root_folder", std::bind(is_needle_extension, _1, {".h", ".hpp"}), headers);
здесь этот объект-функция,который создается с помощью std::bind(is_needle_extension, _1, {".h", ".hpp"}) и передается сразу в find_files, не соответствует типу параметра этой фунции - std::function<bool(const std::string& filename)>
0
Эксперт С++
1588 / 920 / 777
Регистрация: 06.02.2016
Сообщений: 2,408
Записей в блоге: 29
26.06.2017, 21:45 8
Пишите лямбдой
C++
1
2
3
    find_files("root_folder", [&is_needle_extension](const std::string &s) {
        return is_needle_extension(s, {".h", ".hpp"});
    },headers);
0
33 / 33 / 18
Регистрация: 15.05.2013
Сообщений: 236
26.06.2017, 21:48  [ТС] 9
да лямбда изначально была Хотелось выпендриться. Это мой проектик, на работе с лямбдами делаю - они легче читаются.
0
Заблокирован
26.06.2017, 21:53 10
Bretbas, чушь.
0
492 / 207 / 69
Регистрация: 27.05.2016
Сообщений: 551
26.06.2017, 21:59 11
Цитата Сообщение от Bretbas Посмотреть сообщение
и передается сразу в find_files, не соответствует типу параметра этой фунции - std::function<bool(const std::string& filename)>
Все оно соответствует.
Полагаю, правильно надо так:
C++
1
2
using namespace std::placeholders;
find_files("root_folder", std::bind(is_needle_extension, _1, std::vector<std::string>{".h", ".hpp"}), out);
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    auto is_needle_extension =
            []( const std::string& filename, const std::vector<std::string>& needle_extensions ) -> bool
            {
                std::cout << filename;
                return false;
            };
 
    using namespace std::placeholders;
 
    auto b = std::bind(is_needle_extension, _1, std::vector<std::string>{".h", ".hpp"});
    const std::function<bool (const std::string& filename)> predicate = b;
    b("Hello");
    predicate("Hello 2");
Добавлено через 2 минуты

Не по теме:

Да, не увидел 3 пост с ответом.

0
Заблокирован
26.06.2017, 22:03 12
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Короче, объяснение здесь https://stackoverflow.com/a/12431810 (нельзя вывести шаблонный тип из braced list)
3
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
27.06.2017, 00:01 13
вектор бы рефом обернуть...не хорошо получатся же
0
Заблокирован
27.06.2017, 00:46 14
Цитата Сообщение от zarko97 Посмотреть сообщение
вектор бы рефом обернуть
В
C++
1
std::bind(is_needle_extension, _1, std::vector<std::string>{".h", ".hpp"})
?! Чтобы dangling reference (pointer) получить?
1
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
27.06.2017, 01:01 15
daun-autist, хмм...стринги вроде норм дело оборачивать. Насчет векторов не знал, редко биндами пользуюсь...но копию вектора запихивать не оч хорошое дело

Добавлено через 1 минуту
daun-autist, а если там миллион элементов...тем более стринги уфф
0
Заблокирован
27.06.2017, 01:02 16
zarko97, стринги или векторы — без разницы.
C++
1
std::vector<std::string>{".h", ".hpp"}
это временный объект и он будет уничтожен в конце вычисления выражения, так что в reference_wrapper останется невалидный указатель.
1
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
27.06.2017, 01:04 17
daun-autist, и шо делать, если копировать религия не позволяет?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2017, 01:04

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

Передача std::list<> в функцию
Нужно передать список строк в функцию. У меня сделано так: void f(list&lt;string&gt;&amp; list1) {...} ...

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

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

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


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

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

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