Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Infernalboy
3 / 7 / 1
Регистрация: 30.09.2014
Сообщений: 61

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

18.09.2017, 08:35. Показов 1603. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.09.2017, 08:35
Ответы с готовыми решениями:

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

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

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

14
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.09.2017, 09:48
Лучший ответ Сообщение было отмечено 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
 Аватар для Infernalboy
3 / 7 / 1
Регистрация: 30.09.2014
Сообщений: 61
18.09.2017, 09:50  [ТС]
Спасибо, я ужо сообразил)
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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2017, 12:06
Цитата Сообщение от 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.09.2017, 12:26
Цитата Сообщение от hoggy Посмотреть сообщение
как к войд тоже не нужен.
Каст нужен, std::bind принимает callable, а void * таковым не является.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2017, 12:32
Цитата Сообщение от DrOffset Посмотреть сообщение
Каст нужен
нет, не нужен.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.09.2017, 12:42
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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2017, 12:44
крутяк.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще да, ты прав. Ерунду я сказал.
нет, не ерунду.
ерунда - это в шаблоно-функцию пихать войд вместо морального типа)
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.09.2017, 12:47
Цитата Сообщение от 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
 Аватар для Infernalboy
3 / 7 / 1
Регистрация: 30.09.2014
Сообщений: 61
18.09.2017, 12:52  [ТС]
hoggy,
Ась? void к шаблону не имеет отношения, тут только суть в n-аргументах.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2017, 14:22
Цитата Сообщение от Infernalboy Посмотреть сообщение
Ась?
Цитата Сообщение от Infernalboy Посмотреть сообщение
void * processor
Цитата Сообщение от Infernalboy Посмотреть сообщение
f = *(void (Args...)) (*processor);
называется:
сама себе создал проблему на ровном месте.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.09.2017, 15:06
Цитата Сообщение от hoggy Посмотреть сообщение
сам себе создал проблему на ровном месте.
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2017, 15:11
Цитата Сообщение от DrOffset Посмотреть сообщение
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
пускай обобщает на уровне dlsym ---> вертает std::function
0
 Аватар для Infernalboy
3 / 7 / 1
Регистрация: 30.09.2014
Сообщений: 61
18.09.2017, 15:51  [ТС]
Она void так как ничего не должна возвращать. callback это. обобщить, да. возвращать там нечего, и не должно.
0
 Аватар для Infernalboy
3 / 7 / 1
Регистрация: 30.09.2014
Сообщений: 61
08.10.2017, 06:55  [ТС]
Короче, сделал все вот так. Если кому то интересно Ушел от шаблонов как можно дальше. Немного пришлось продублировать руками.
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2017, 06:55
Помогаю со студенческими работами здесь

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

Дважды вычислить значение выражения, используя функции возвращающие void и не 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;); как его теперь коректно вызвать: typedef void...

дважды вычислить значение выражения, используя функции возвращающие 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 chislitel= pow(n-m,2); float...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru