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

Передача функции-члена в качестве аргумента (не через указатель) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 5.00
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
23.03.2013, 21:38     Передача функции-члена в качестве аргумента (не через указатель) #1
Привет!
Озадачился такой проблемой - вот пример того, что нужно
C++
1
2
3
4
typedef void(class1::*method)();
void func (method) {};
 
func (&class1::func); // вызов
Но хочется сделать кошерно, и, чтоб было совсем кошерно, решил заюзать С++11, которого я почти не знаю
Вот что получилось
C++
1
2
3
4
typedef std::function<void(param&)> method;
void func (method){};
 
func(std::bind(&class1::methodName, object_ptr, std::placeholders::_1)); // вызов
согласитесь - выглядет ужасно. Хочеться std::bind() спрятать внуть функции, т.е. вот так
C++
1
2
3
4
5
6
7
8
typedef void(class1::*method)();
 
void func (method)
{
    // blah blah blah std::bind (method, ...)
}
 
func(&class1::methodName); // вызов
но не могу придумать как обойтись без указателя void(class1::*method)().
Знаю, что есть люди, которы ориентируются в С++11, может есть идеи?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2013, 21:38     Передача функции-члена в качестве аргумента (не через указатель)
Посмотрите здесь:

C++ Builder как передать функции в качестве аргумента указатель на функцию описанной в другом классе?
C++ Передача двумерного массива в качестве аргумента функции
C++ Передача функции в качестве аргумента массив
Как передать функции указатель на функцию в качестве аргумента? C++
Передача символьного массива в качестве аргумента C++
C++ Передача члена класса в качестве параметра метода
C++ Передача объекта в качестве аргумента функции (метода)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.03.2013, 23:40     Передача функции-члена в качестве аргумента (не через указатель) #2
Но ведь если функция не static, объект все равно нужно передавать как-то. Над каким объектом будет выполняться func?
C++
1
func(&class1::methodName);
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.03.2013, 08:35     Передача функции-члена в качестве аргумента (не через указатель) #3
Задача состоит в том, чтобы каким-то образом специализировать передаваемые методы, т.е. ограничить классы, чьи методы могут передаваться, ограничить количество аргументов передаваемой функции?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
24.03.2013, 10:26  [ТС]     Передача функции-члена в качестве аргумента (не через указатель) #4
Похоже я криво задачу описал)
Задача состоит в том, чтобы избавиться от указателя. Грубо говоря, что писать в typedef
C++
1
typedef void(class1::*method)();
?
Т.е. что-нибудь типа
C++
1
typedef std::function<void(param&)> method;
только для функции-члена.
Цитата Сообщение от Tulosba Посмотреть сообщение
Но ведь если функция не static, объект все равно нужно передавать как-то. Над каким объектом будет выполняться func?
Над этим я уже подумал, все нормально.
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
24.03.2013, 12:08     Передача функции-члена в качестве аргумента (не через указатель) #5
Фрагмент примера из cppreference:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <functional>
#include <iostream>
 
struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_+i << '\n'; }
    int num_;
};
 
int main()
{
    // store a call to a member function
    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
    Foo foo(314159);
    f_add_display(foo, 1);
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.03.2013, 12:21     Передача функции-члена в качестве аргумента (не через указатель) #6
Kastaneda, т.е. никаких ограничений не ставится? Тогда почему бы просто не сделать функцию шаблонной?
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
#include <iostream>
#include <functional>
 
template <class F, class O, class... Args>
auto call(F&& function, O& object, Args&&... args)
    -> decltype(function(&object, std::forward<Args>(args)...))
{
    return function(&object, std::forward<Args>(args)...);
}
 
class Foo
{
public:
    Foo()
    {
 
    }
 
    int add(int a, int b) const
    {
        return a + b;
    }
};
 
int main()
{
    const Foo f;
    std::cout << call(std::mem_fn(&Foo::add), f, 4, 6) << std::endl;
    return 0;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
24.03.2013, 14:35  [ТС]     Передача функции-члена в качестве аргумента (не через указатель) #7
Nick Alte, спасибо, то что нужно. Причем я вчера читал именно ту самую страницу из твоей ссылки, как-то мимо глаз пропустил данную возможность. Я почему-то решил, что std::function<> не может быть функцией-членом.

soon, круто, но вариант с std::function<> куда проще
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.03.2013, 14:46     Передача функции-члена в качестве аргумента (не через указатель) #8
Kastaneda, просто я до сих пор не понял, что вам требуется Я считал, что вам нужна функция, принимающая метод. Разумеется, по аналогии с Nick Alte можно упростить мой вариант.
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>
#include <functional>
 
class Foo
{
public:
    Foo()
    {
 
    }
 
    int add(int a, int b) const
    {
        return a + b;
    }
};
 
int main()
{
    Foo f;
    auto add = std::mem_fn(&Foo::add);
    std::cout << add(&f, 4, 6) << std::endl;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2013, 16:31     Передача функции-члена в качестве аргумента (не через указатель)
Еще ссылки по теме:

C++ Передача матрицы в метод в качестве аргумента
C++ Передача массива в качестве аргумента функции
Передача массива другой функции через указатель C++
C++ Возможна ли передача двумерного массива в качестве аргумента функции по ссылке
C++ Передача метода класса в качестве аргумента внешней функции

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
24.03.2013, 16:31  [ТС]     Передача функции-члена в качестве аргумента (не через указатель) #9
C++
1
add(&f, 4, 6)
я до сегодняшнего дня с данной семантикой не был знаком, ну теперь буду знать
Я считал, что вам нужна функция, принимающая метод.
Ну да, вот примерно что я делаю
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
class Menu
{
public:
    enum Item {Show};
 
    Item getMenuItem();
};
 
class Executer
{
public:
    void show(container&);
private:
};
 
class Worker
{
public:
    void addItem (Menu::Item item, container::method method)
    {
        methods[item] = method;
    }
 
    void work ()
    {
        mehtods[Menu::getMenuItem()](*cont);
    }
 
private:
    std::map<Menu::Item, container::method> methods;
    container *cont;
};
 
worker.addItem(Show, &container::show);
писал на коленке для примера.

Собственно проблема была в том, как сделать typedef container::method.
Yandex
Объявления
24.03.2013, 16:31     Передача функции-члена в качестве аргумента (не через указатель)
Ответ Создать тему
Опции темы

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