Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 54
#1

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

18.09.2017, 08:35. Просмотров 278. Ответов 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++):

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

Где void?
Скорее всего тема опять будет пустовать, но я таки попробую. if ( __SETP__(_AH...

delete void*
class MyClass{ public: int i; }; void main() { MyClass* MyObj = new...

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

Приведение к void
Приветствую. Как правильно в С++ привести данные к типу void? int Data; void...

Void To Bool
Как можно void преобразовать в bool? if(Skype1-&gt;Attach(6, VARIANT_TRUE)) {...

14
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
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
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 54
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
Заблокирован
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
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
18.09.2017, 12:26 #5
Цитата Сообщение от hoggy Посмотреть сообщение
как к войд тоже не нужен.
Каст нужен, std::bind принимает callable, а void * таковым не является.
0
hoggy
Заблокирован
18.09.2017, 12:32 #6
Цитата Сообщение от DrOffset Посмотреть сообщение
Каст нужен
нет, не нужен.
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
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
Заблокирован
18.09.2017, 12:44 #8
крутяк.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще да, ты прав. Ерунду я сказал.
нет, не ерунду.
ерунда - это в шаблоно-функцию пихать войд вместо морального типа)
1
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
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
Сообщений: 54
18.09.2017, 12:52  [ТС] #10
hoggy,
Ась? void к шаблону не имеет отношения, тут только суть в n-аргументах.
0
hoggy
Заблокирован
18.09.2017, 14:22 #11
Цитата Сообщение от Infernalboy Посмотреть сообщение
Ась?
Цитата Сообщение от Infernalboy Посмотреть сообщение
void * processor
Цитата Сообщение от Infernalboy Посмотреть сообщение
f = *(void (Args...)) (*processor);
называется:
сама себе создал проблему на ровном месте.
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
18.09.2017, 15:06 #12
Цитата Сообщение от hoggy Посмотреть сообщение
сам себе создал проблему на ровном месте.
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
0
hoggy
Заблокирован
18.09.2017, 15:11 #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Может у него этот указатель функция dlsym возвращает. А он хочет обобщить каст и бинд этого указателя к аргументам?
пускай обобщает на уровне dlsym ---> вертает std::function
0
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 54
18.09.2017, 15:51  [ТС] #14
Она void так как ничего не должна возвращать. callback это. обобщить, да. возвращать там нечего, и не должно.
0
Infernalboy
3 / 3 / 1
Регистрация: 30.09.2014
Сообщений: 54
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
Привет! Вот еще темы с решениями:

Convert void to HWND
Ошибка:E2034 Cannot convert 'void *' to 'HWND__ *' Понимаю что вопрос...

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

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

static void Main(string[] args)
Что такое string args в строке static void Main(string args) и зачем это...


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

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

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