Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 56
1

Void * processor to (void(Args.) (*processor)

18.09.2017, 08:35. Показов 1182. Ответов 14
Метки нет (Все метки)

Здравствуйте. Имеем void* значением которого является адрес функции. Как скастить этот указатель в указатель на функцию?
C++
1
2
3
4
5
template<typename ... Args>
void Manager::processResponse(void * processor, Args... args) {
     std::function<void(Args...)> f =  (void (Args...)) (*processor);// Вот как такое можно провернуть, должен же быть какой то способ
     responseProsessorsPool.submit(std::bind(f, args));
}
Так как гугл мне не помог пишу сюда. Буду очень рад помощи.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2017, 08:35
Ответы с готовыми решениями:

Перенаправление из Void в другой Void
Решил я значит сделать себе терминал как в Fallout,и столкнулся с такой проблемой,из void нельзя...

Потоки: зачем в вызываемой функции надо писать (void *args)?
void* helloWorld(void *args) { //какой-то код} pthread_create(&amp;thread, NULL, helloWorld, NULL);...

Ошибка cannot convert from type void*(classname::) () to type void*(*)(void*)
Подскажите пожалуйста как избавиться от ошибки? Есть ещё какой-либо способ, кроме как объявить...

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это идет в классе это...

14
15129 / 8125 / 1963
Регистрация: 30.01.2014
Сообщений: 13,809
18.09.2017, 09:48 2
Лучший ответ Сообщение было отмечено Infernalboy как решение

Решение

Infernalboy,
C++
1
2
3
4
5
template<typename ... Args>
void processResponse(void * processor, Args... args) {
     void (* f)(Args...) = reinterpret_cast<void(*)(Args...)>(processor);
     responseProsessorsPool.submit(std::bind(f, args...));
}
std::function тут не нужен.
1
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 56
18.09.2017, 09:50  [ТС] 3
Спасибо, я ужо сообразил)
C++
1
2
3
4
5
template<typename ... Args>
    void Manager::processResponse(void * processor, Args... args) {
        std::function<void()> f = std::bind(reinterpret_cast<void (*)(Args...)>(processor), args...);
        responseProsessorsPool.submit(f);
    }
0
Эксперт С++
8430 / 4102 / 895
Регистрация: 15.11.2014
Сообщений: 9,216
18.09.2017, 12:06 4
Цитата Сообщение от DrOffset Посмотреть сообщение
std::function тут не нужен.
как к войд тоже не нужен.

C++
1
2
3
4
template<typename ... Args>
void processResponse(void * processor, Args... args) {
     responseProsessorsPool.submit(std::bind(f, ::std::forward<Args>(args)...));
}
0
15129 / 8125 / 1963
Регистрация: 30.01.2014
Сообщений: 13,809
18.09.2017, 12:26 5
Цитата Сообщение от hoggy Посмотреть сообщение
как к войд тоже не нужен.
Каст нужен, std::bind принимает callable, а void * таковым не является.
0
Эксперт С++
8430 / 4102 / 895
Регистрация: 15.11.2014
Сообщений: 9,216
18.09.2017, 12:32 6
Цитата Сообщение от DrOffset Посмотреть сообщение
Каст нужен
нет, не нужен.
0
15129 / 8125 / 1963
Регистрация: 30.01.2014
Сообщений: 13,809
18.09.2017, 12:42 7
PS.
Тут у тебя опечатка вероятно (f - не объявлен):
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
2
3
4
template<typename ... Args>
void processResponse(void * processor, Args... args) {
     responseProsessorsPool.submit(std::bind(f, ::std::forward<Args>(args)...));
}
Добавлено через 2 минуты
hoggy, Вообще да, ты прав. Ерунду я сказал.
2
Эксперт С++
8430 / 4102 / 895
Регистрация: 15.11.2014
Сообщений: 9,216
18.09.2017, 12:44 8
крутяк.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще да, ты прав. Ерунду я сказал.
нет, не ерунду.
ерунда - это в шаблоно-функцию пихать войд вместо морального типа)
1
15129 / 8125 / 1963
Регистрация: 30.01.2014
Сообщений: 13,809
18.09.2017, 12:47 9
Цитата Сообщение от hoggy Посмотреть сообщение
нет, не ерунду.
Да. Надо больше спать
Верну обратно пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename ... Args>
void processResponse(void * processor, Args... args) {
     std::bind(processor, ::std::forward<Args>(args)...)();
}
 
void foo(int)
{
}
 
int main()
{
    processResponse((void*)foo, 1);
}
http://rextester.com/VTVP68414
1
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 56
18.09.2017, 12:52  [ТС] 10
hoggy,
Ась? void к шаблону не имеет отношения, тут только суть в n-аргументах.
0
Эксперт С++
8430 / 4102 / 895
Регистрация: 15.11.2014
Сообщений: 9,216
18.09.2017, 14:22 11
Цитата Сообщение от Infernalboy Посмотреть сообщение
Ась?
Цитата Сообщение от Infernalboy Посмотреть сообщение
void * processor
Цитата Сообщение от Infernalboy Посмотреть сообщение
f = *(void (Args...)) (*processor);
называется:
сама себе создал проблему на ровном месте.
0
15129 / 8125 / 1963
Регистрация: 30.01.2014
Сообщений: 13,809
18.09.2017, 15:06 12
Цитата Сообщение от hoggy Посмотреть сообщение
сам себе создал проблему на ровном месте.
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
0
Эксперт С++
8430 / 4102 / 895
Регистрация: 15.11.2014
Сообщений: 9,216
18.09.2017, 15:11 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
пускай обобщает на уровне dlsym ---> вертает std::function
0
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 56
18.09.2017, 15:51  [ТС] 14
Она void так как ничего не должна возвращать. callback это. обобщить, да. возвращать там нечего, и не должно.
0
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 56
08.10.2017, 06:55  [ТС] 15
Короче, сделал все вот так. Если кому то интересно Ушел от шаблонов как можно дальше. Немного пришлось продублировать руками.
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
void Manager::processResponse(std::shared_ptr<BaseFunctor> processor, ObjectPtr object, bool success) {     
        std::shared_ptr<TypedFunctor<std::function<void(ObjectPtr, bool)>>> ff = std::static_pointer_cast<TypedFunctor<std::function<void(ObjectPtr, bool)>>>(processor);
        responseProsessorsPool->submit(std::bind(ff->functor, object, success));        
    }
    
    void Manager::processResponse(std::shared_ptr<BaseFunctor> processor, ObjectsArrayPtr objects, bool success) {      
        std::shared_ptr<TypedFunctor<std::function<void(ObjectsArrayPtr, bool)>>> ff = std::static_pointer_cast<TypedFunctor<std::function<void(ObjectsArrayPtr, bool)>>>(processor);
        responseProsessorsPool->submit(std::bind(ff->functor, objects, success));       
    }
    
    void Manager::processResponse(std::shared_ptr<BaseFunctor> processor, bool success) {       
        std::shared_ptr<TypedFunctor<std::function<void(bool)>>> ff = std::static_pointer_cast<TypedFunctor<std::function<void(bool)>>>(processor);
        responseProsessorsPool->submit(std::bind(ff->functor, success));        
    }
    
    void Manager::processResponse(std::shared_ptr<BaseFunctor> processor, RCDriver::agent::Tokens & tokens, bool success) {     
        std::shared_ptr<TypedFunctor<std::function<void(RCDriver::agent::Tokens, bool)>>> ff = std::static_pointer_cast<TypedFunctor<std::function<void(RCDriver::agent::Tokens, bool)>>>(processor);
        responseProsessorsPool->submit(std::bind(ff->functor, tokens, success));        
    }
    
    void Manager::processResponse(std::shared_ptr<BaseFunctor> processor, size_t hash, bool success) {      
        std::shared_ptr<TypedFunctor<std::function<void(size_t, bool)>>> ff = std::static_pointer_cast<TypedFunctor<std::function<void(size_t, bool)>>>(processor);
        responseProsessorsPool->submit(std::bind(ff->functor, hash, success));      
    }

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct BaseFunctor {
            RequestType type;
    };
    template <typename T>
    struct TypedFunctor: public BaseFunctor {
            T functor;
    };
     
    typedef std::shared_ptr<BaseFunctor> Functor; 
    
     std::shared_ptr<BaseFunctor> makeFindFunctor(std::function<void(ObjectsArrayPtr, bool)> func);
    
     std::shared_ptr<BaseFunctor> makeSaveFunctor(std::function<void(ObjectPtr, bool)> func);
     std::shared_ptr<BaseFunctor> makeUpdateFunctor(std::function<void(bool)> func);

Таким образом повысил надежность кода и избавился от страшных кастов. До этого был еще вариант с std::dynamic_pointer_cast<>(), но это медленно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2017, 06:55

Дважды вычислить значение выражения, используя функции возвращающие void и не void
Хай!Помогите решить Дважды вычислить значение выражения, используя функции возвращающие void...

Как написать это - void fastcall TForml:oOp(void)?
Добрый день! Подскажите пожайлуста: Как написать это - void fastcall TForml:: DoOp(void)? Как...

Typedef void (WINAPI *GLEND)(void), как вызывать?
импортирую метод GLEND glmethod = (GLEND) GetProcAddress(hModule, &quot;glEnd&quot;); как его теперь...

дважды вычислить значение выражения, используя функции возвращающие void и не void. Компилятор 6 ошибок показывает
#include &lt;iostream.h&gt; #include &lt;math.h&gt; void proc (int n, int m, int k, float &amp;rez) { float...

Cannot convert from 'void (__thiscall CTest::* )(void)' to 'BYTE *'
Вообщем. Есть функция, которую нужно перехватить, она находится в памяти программы и у нас есть...

Что значит void(*f)()=(void(*)()func?
void(*f)()=(void(*)())func; Объясните, пожалуйста, что значит этот код.


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

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

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