Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 5.00
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
#1

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

23.03.2013, 21:38. Просмотров 2827. Ответов 8
Метки нет (Все метки)

Привет!
Озадачился такой проблемой - вот пример того, что нужно
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, может есть идеи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2013, 21:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача функции-члена в качестве аргумента (не через указатель) (C++):

Передача в новый поток в качестве аргумента string - C++
хелп:wall: Пытаюсь передать аргумент так: DWORD potoc(char * args) { const char * ta = static_cast &lt;const char *&gt; (args); } ...

Указатель на метод класса в качестве аргумента метода класса - C++
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Как не писать один и тот же код, для функции, принимающей разные типы данных в качестве аргумента - C++
Проблема такая: есть некая функция. Внутри нее происходят одни и теже вычисления, вне зависимости от типа входных данных. void...

Замена экземпляра структуры для подачи в качестве аргумента - C++
Интересует есть ли способ замены экземпляра структуры для подачи в функцию. Т.е. если я создаю собственную структуру(естественно с...

Передача аргумента в созданный поток - C++
Здравствуйте, суть такова: Создаётся некий поток: DWORD WINAPI MyThread(LPVOID lpParam) { MyStruct data = *(MyStruct*)...

как передать функции в качестве аргумента указатель на функцию описанной в другом классе? - C++ Builder
Есть два класса A и B в классе A есть две функции funcA_1 и funcA_2 в классе B - funcB в funcA_1 создается экземпляр класса B и...

8
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.03.2013, 23:40 #2
Но ведь если функция не static, объект все равно нужно передавать как-то. Над каким объектом будет выполняться func?
C++
1
func(&class1::methodName);
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.03.2013, 08:35 #3
Задача состоит в том, чтобы каким-то образом специализировать передаваемые методы, т.е. ограничить классы, чьи методы могут передаваться, ограничить количество аргументов передаваемой функции?
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 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?
Над этим я уже подумал, все нормально.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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);
}
1
soon
2542 / 1307 / 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;
}
1
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
24.03.2013, 14:35  [ТС] #7
Nick Alte, спасибо, то что нужно. Причем я вчера читал именно ту самую страницу из твоей ссылки, как-то мимо глаз пропустил данную возможность. Я почему-то решил, что std::function<> не может быть функцией-членом.

soon, круто, но вариант с std::function<> куда проще
0
soon
2542 / 1307 / 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;
}
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 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.
0
24.03.2013, 16:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2013, 16:31
Привет! Вот еще темы с ответами:

Передача функции как аргумента - C++ Builder
Подскажите, пожалуйста, как передать функцию в качестве аргумента в другую функцию, чтобы там ее выполнить

Структуры и их передача через указатель - C++ Builder
Есть структура static struct Flash { std::string name ; unsigned short page ; unsigned short byte ; unsigned char ...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель) - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { public: T1 n; T1 a; void input() ...

Передать указатель на массив в качестве аргумента функции - C++/CLI
Работаю в Visual Studio 2012 Ultimate, задание - сделать свою библиотеку. Пишу на Visual C++. Решил делать просто - 3 библиотечных функции,...


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

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

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