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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 69, средняя оценка - 4.77
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
#1

Передача типа указателя на функцию - C++

27.06.2013, 17:26. Просмотров 8508. Ответов 20
Метки нет (Все метки)

Всем привет.

Недавно в теме начинающих возник вопрос, а можно ли передать тип (указатель на функцию) без использования typedef:
C++
1
2
typedef void (*func)(void);
func f = va_arg(vl,func);
Конкретно речь идет о втором аргументе макроса va_arg (из <cstdarg>).
Первое, что пришло на ум, это использование decltype. Но всё же эта фишка C++11. А есть ли решение в старом стиле?

Заранее спасибо.

Добавлено через 6 часов 36 минут
@vxg предложил такой вариант:
Кликните здесь для просмотра всего текста
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 <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
 
int my_super_function(int x)
{
    return 2 * x;
}
 
void my_super_puper_function(const char *format, ...)
{
    va_list arglist;
    va_start(arglist, format);
    int (*f)(int x) = (int (*)(int x))va_arg(arglist, void *);
    printf("%i\n", f(2));
    va_end(arglist);
}
 
int main(int argc, char* argv[])
{
    my_super_puper_function("%p", my_super_function);
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.06.2013, 15:21  [ТС]     Передача типа указателя на функцию #16

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Ну а дальше уже работа с деревом.
да тут не одно дерево, а целый темный лес


Интересно было бы MS-макрос полечить, чтоб он умел как gcc тип принимать.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
28.06.2013, 20:14     Передача типа указателя на функцию #17
Вцелом, т.к. в MSVC все ок с переводом из void* в function-pointer то почему бы не

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
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
 
int my_super_function(int x)
{
    return 2 * x;
}
 
#ifdef _MSC_VER
#define VA_ARG_FUNCTION(arglist, signature) \
    (signature)va_arg((arglist), void*)
#else
#define VA_ARG_FUNCTION(arglist, signature) \
    va_arg((arglist), signature)
#endif
 
void my_super_puper_function(const char *format, ...)
{
    va_list arglist;
    va_start(arglist, format);
    int (*f)(int x) = VA_ARG_FUNCTION(arglist, int(*)(int));
    printf("%i\n", f(2));
    va_end(arglist);
}
 
int main(int argc, char* argv[])
{
    my_super_puper_function("%p", my_super_function);
    system("pause");
    return 0;
}
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
30.06.2013, 17:06     Передача типа указателя на функцию #18
Вот что придумал на базе кода из первого поста:
вводим дополнительную сущность
C++
1
2
3
4
union fptr
{
    int (*ptr)(int);
};
внтури my_super_puper_function()
C++
1
int (*f)(int x) = va_arg(arglist, fptr).ptr;
итого весь код
Кликните здесь для просмотра всего текста
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
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
 
int my_super_function(int x)
{
    return 2 * x;
}
 
union fptr
{
    int (*ptr)(int);
};
 
void my_super_puper_function(const char *format, ...)
{
    va_list arglist;
    va_start(arglist, format);
    int (*f)(int x) = va_arg(arglist, fptr).ptr;
    printf("%i\n", f(2));
    va_end(arglist);
}
 
int main(int argc, char* argv[])
{
    my_super_puper_function("%p", my_super_function);
    system("pause");
    return 0;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.06.2013, 17:22  [ТС]     Передача типа указателя на функцию #19
@Kastaneda, интересный подход. А union вместо struct потому что на 1 символ короче?
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
30.06.2013, 17:28     Передача типа указателя на функцию #20
Цитата Сообщение от Tulosba Посмотреть сообщение
А union вместо struct потому что на 1 символ короче?
Вообще можно было и struct, но union можно расширять
C++
1
2
3
4
5
union fptr
{
    int (*ptr1)(int);
    void (*ptr2)(int);
};
без увеличения занимаемого им места, а struct нет. Расширение может понадобиться для того, чтобы избежать привидение типа внутри my_super_puper_function(). Хотя преимущество конечно спорное, т.к. расширять можно до бесконечности и всех вариантов все равно не переберешь. Поэтому наверное практичней сделать ptr как void(*ptr)(), а внути my_super_puper_function() уже руками приводить к чему надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2013, 18:23     Передача типа указателя на функцию
Еще ссылки по теме:
C++ Передача указателя в функцию по ссылке
Передача указателя на метод в функцию C++
Передача указателя в функцию по ссылке C++
C++ Передача указателя на вектор в функцию
C++ WinAPI Передача указателя на CALLBACK функцию

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.06.2013, 18:23  [ТС]     Передача типа указателя на функцию #21
Цитата Сообщение от Kastaneda Посмотреть сообщение
а struct нет
Со структурой из нескольких полей придется и при передаче в функцию (с ...) структуру передавать, а не просто указатель на функцию. Т.е. "дополнительная сущность" должна быть известна и за пределами my_super_puper_function, что не очень хорошо.
Yandex
Объявления
30.06.2013, 18:23     Передача типа указателя на функцию
Ответ Создать тему
Опции темы

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