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

callback функции и функциональные объекты в качестве параметров - C++

Восстановить пароль Регистрация
 
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
13.09.2012, 18:15     callback функции и функциональные объекты в качестве параметров #1
Всем привет. В STL есть алгоритмы, которые требуют наличия функционального объекта, например sort, а некоторые алгоритмы, такие как for_each - принимают третьим параметром callback функцию.

Вопрос как самому сделать подобные функции, которые принимают как параметры callback - ф-ции или функциональные объекты?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.09.2012, 18:35     callback функции и функциональные объекты в качестве параметров #2
operator()
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>
 
template <class Iterator, class Function>
Function foreach(Iterator begin, Iterator end, Function func)
{
  for (; begin != end; ++begin) {
    func(*begin); // func::operator() для объектов-функторов,
                  // или просто вызов для указателей на функцию
  }
  return func;
}
 
template <class T>
class Accumulator {
  T sum;
public:
  void operator()(const T &value) { sum = sum + value; }
  T get() { return sum; }
};
 
template <class T>
void printer(const T &value)
{
  std::cout << value << " ";
}
 
int main()
{
  int array[] = { 1, 2, 3, 4, 5 };
  
  foreach(array, array + 5, printer<int>);
  std::cout << "\n"
            << foreach(array, array + 5, Accumulator<int>()).get();
}
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 22:48     callback функции и функциональные объекты в качестве параметров #3
Цитата Сообщение от moskitos80 Посмотреть сообщение
Вопрос как самому сделать подобные функции, которые принимают как параметры callback - ф-ции или функциональные объекты?
Нужно принимать патаметр по типу такого
C++
1
2
3
4
5
#include <functional>
void my_min( std::function< void (int) > func) {
// Вызываем колбек
func( 123 );
}
Тут твоя функция my_min умеет принимать и указатели на функции, и функторы, и лямбды. Они должны принимать 1 параметр int и не возвращать ничего - это указано в конструкции void(int).

Либо, можно принимать только указатель, по старинке:
C++
1
2
3
4
void my_min( void (*func)(int) ) {
// Вызываем колбек
func( 123 );
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.09.2012, 09:20     callback функции и функциональные объекты в качестве параметров #4
PSIAlt, Реально говоря, не стоит в алгоритмах принимать std::function, резоннее всего делать как делают в STL (принимать функтор как шаблонный параметр).
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
14.09.2012, 11:49  [ТС]     callback функции и функциональные объекты в качестве параметров #5
Ещё вопрос: а если предполагается передавать в качестве callback - а метод какого-нибудь класса, и ещё, если предполагается передавать статический метод класса? Как тогда?

И ещё как все-таки правильно так:
C++
1
2
3
4
void my_min(void (*func)(int)) {
  // Вызываем колбек
  func( 123 );
}
Или так:
C++
1
2
3
4
void my_min(func) {
  // Вызываем колбек
  func( 123 );
}
Или оба примеры правильны, и разница лишь в том, что второй показывает, как принимать шаблонную ф-цию?
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
14.09.2012, 12:08     callback функции и функциональные объекты в качестве параметров #6
Второй неправильный, откуда компилятор узнает, что это вообще такое передается в функцию?
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
14.09.2012, 12:59  [ТС]     callback функции и функциональные объекты в качестве параметров #7
Согласен фигню спорол вот так у меня заработало:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
 
using namespace std;
 
//////////////////////////////////////////////////////////////
template <class T>
bool my_asc(T &a, T &b)
{
    T temp = NULL;
    if (a > b) {
        temp = a;
        a    = b;
        b    = temp;
        return true;
    }
    return false;
}
//////////////////////////////////////////////////////////////
template <class T>
bool my_desc(T &a, T &b)
{
    T temp = NULL;
    if (a < b) {
        temp = a;
        a   = b;
        b   = temp;
        return true;
    }
    return false;
}
//////////////////////////////////////////////////////////////
template <class T, class F>
void my_sort(T *a_start, T *a_end, F func)
{
    int size = a_end - a_start;
    for (int i = 0; i < size; i++) {
        for (int j = i + 1; j < size; j++) {
            func(*(a_start + i), *(a_start + j));
        }
    }
    return;
}
//////////////////////////////////////////////////////////////
int main()
{
    int arr1[] = {5,6,8,7, 1,2,9,3};
 
    my_sort(arr1, (arr1 + 8), my_asc<int> );
 
    int *start = arr1;
    int *end   = (arr1 + 8);
 
    cout << "ASC" << endl;
 
    for (; start < end; start++) {
        cout << *start << endl;
    }
 
    start = arr1;
    my_sort(arr1, (arr1 + 8), my_desc<int> );
 
    cout << endl << "DESC" << endl;
 
    for (; start < end; start++) {
        cout << *start << endl;
    }
 
    return 0;
}
А вопрос как работать в данном контексте со статичными методами, и просто методами классов - остаётся открытым
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
14.09.2012, 13:27     callback функции и функциональные объекты в качестве параметров #8
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>
 
class A{
public:
   static void static_method(int i){std::cout<<"static "<<i<<'\n';};
   void method(int i){std::cout<<"non-static "<<i<<'\n';};
};
 
void proc(void (*fPtr)(int))
{
   fPtr(2);
}
 
void proc(A& obj, void (A::*mPtr)(int))
{
    (obj.*mPtr)(3);
}
 
int main()
{
   proc(&A::static_method);
   A a;
   proc(a, &A::method);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2012, 13:32     callback функции и функциональные объекты в качестве параметров
Еще ссылки по теме:

что такое int argc, char *argv[] в качестве параметров главной (main) функции? C++
Как будет выглядеть заголовок функции, принимающей в качестве входных параметров два целых числа и возвращающей число с плавающей запятой двойной точн C++
For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.09.2012, 13:32     callback функции и функциональные объекты в качестве параметров #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
moskitos80, Без С++11 или буста - совмещение связано как минимум с собственноручным написанием множества перегрузок функций. А С++11 все просто.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <functional>
 
template<typename T, typename Foo>
typename std::result_of<Foo(T)>::type some_method(const T& argument, Foo cb)
{
   return cb(argument);
}
 
int main()
{
   struct Local
   {
      void print_non_static(int) { std::cout << "Non static local" << std::endl; }
      static void print(int) { std::cout << "Local" << std::endl; }
   };
   some_method(1, [](int value) { std::cout << value << std::endl; return value; });
   some_method(1, &Local::print);
   Local object;
   some_method(1, std::bind(&Local::print_non_static, object, std::placeholders::_1));
}
http://liveworkspace.org/code/284509...5c8482ac14fc0c

Добавлено через 4 минуты
Хотя вот так пожалуй будет универсальнее.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <functional>
 
template<typename Foo, typename... Args>
typename std::result_of<Foo(Args...)>::type some_method(Foo cb, Args&&... args)
{
   return cb(std::forward<Args>(args)...);
}
 
int main()
{
   struct Local
   {
      void print_non_static() { std::cout << "Non static local" << std::endl; }
      static void print() { std::cout << "Local" << std::endl; }
   };
   some_method([](int value) { std::cout << value << std::endl; return value; }, 1);
   some_method(&Local::print);
   Local object;
   some_method(std::bind(&Local::print_non_static, object));
}
http://liveworkspace.org/code/494bf2...7c975143ca6d50
Yandex
Объявления
14.09.2012, 13:32     callback функции и функциональные объекты в качестве параметров
Ответ Создать тему
Опции темы

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