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

C++

Войти
Регистрация
Восстановить пароль
 
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 53
#1

Void * processor to (void(Args.) (*processor) - C++

18.09.2017, 08:35. Просмотров 234. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2017, 08:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Void * processor to (void(Args.) (*processor) (C++):

delete void* - C++
class MyClass{ public: int i; }; void main() { MyClass* MyObj = new MyClass; MyObj-&gt;i = 10; void* VoidLink =...

Где void? - C++
Скорее всего тема опять будет пустовать, но я таки попробую. if ( __SETP__(_AH &amp; 0x44, 0) ) v4f9ab0(0, 0,...

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

Приведение к void - C++ Builder
Приветствую. Как правильно в С++ привести данные к типу void? int Data; void *ptrData; ptrData = &amp;Data; // Так правильно? ...

Void To Bool - C++ Builder
Как можно void преобразовать в bool? if(Skype1-&gt;Attach(6, VARIANT_TRUE)) { ShowMessage(&quot;ERROR&quot;); } Не работает. Cannot convert...

Convert void to HWND - C++ Builder
Ошибка:E2034 Cannot convert 'void *' to 'HWND__ *' Понимаю что вопрос идиотский, но все же, что здесь не так? HANDLE hFile=...

14
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
18.09.2017, 09:48 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 53
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
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
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
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
18.09.2017, 12:26 #5
Цитата Сообщение от hoggy Посмотреть сообщение
как к войд тоже не нужен.
Каст нужен, std::bind принимает callable, а void * таковым не является.
0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
18.09.2017, 12:32 #6
Цитата Сообщение от DrOffset Посмотреть сообщение
Каст нужен
нет, не нужен.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
18.09.2017, 12:44 #8
крутяк.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще да, ты прав. Ерунду я сказал.
нет, не ерунду.
ерунда - это в шаблоно-функцию пихать войд вместо морального типа)
1
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 53
18.09.2017, 12:52  [ТС] #10
hoggy,
Ась? void к шаблону не имеет отношения, тут только суть в n-аргументах.
0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
18.09.2017, 14:22 #11
Цитата Сообщение от Infernalboy Посмотреть сообщение
Ась?
Цитата Сообщение от Infernalboy Посмотреть сообщение
void * processor
Цитата Сообщение от Infernalboy Посмотреть сообщение
f = *(void (Args...)) (*processor);
называется:
сама себе создал проблему на ровном месте.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
18.09.2017, 15:06 #12
Цитата Сообщение от hoggy Посмотреть сообщение
сам себе создал проблему на ровном месте.
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
18.09.2017, 15:11 #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
пускай обобщает на уровне dlsym ---> вертает std::function
0
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 53
18.09.2017, 15:51  [ТС] #14
Она void так как ничего не должна возвращать. callback это. обобщить, да. возвращать там нечего, и не должно.
0
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 53
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
08.10.2017, 06:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2017, 06:55
Привет! Вот еще темы с ответами:

Переобразовать void в int - C++ Builder
Как переобразовать void в int???:popcorn:

Ссылка на void функцию контрола - C++ Builder
В проекте использую сторонние компоненты InstrumentLab, это стрелочные и цифровые индикаторы. у компонентов есть поле Value для...

System.Void из C# использоваться не может - для получения объекта типа void используйте typeof (void) - C#
Изучаю с# по &quot;Шилдт Г. - C# 4.0 полное руководство&quot; При изучении конструктора возникла проблема: попытался запустить код на стр. 169, а...

Реализовать аналог `void *memmove(void *to, void *from, size_t n)` - C (СИ)
Добрый день, подскажите пожалуйста, как реализовать такой метод самостоятельно? который копирует из одного массива в другой n элементов ...


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

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

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