2017-02-19 3 views
-1

У меня проблема. Я пытаюсь преобразовать void * в std :: function. Это лишь простой пример, любые предложения будут оцененылитье void * to std :: function

#.h file 
class Example { 

public: 

    Example(); 
    int foo(void* hi); 

    int fooFunc(std::function<int(int, int)> const& arg, int x, int y) { 
    foo(arg.target<void*>(), x, y); 
    return 2; 
    } 

}; 


#.cpp file 
Example::Example() { 

    } 

    int Example::foo(void * func, int x, int y) 
    { 
    //cast back to std::function 
    func(x, y); 
    std::cout << "running in foo: " << a << "\n"; 
    return a; 
    } 

Каждый кастинг я пытался не работал.

Я знаю, что могу отправить std::function в этом примере, но это для чего-то большего, и я работаю над примером, чтобы заставить его работать здесь.

Весь смысл void*, предназначен для использования в некоторых ситуациях, когда вы не знаете, что получите, а затем примените его к конкретному использованию, которое вам нужно.

Спасибо!

+1

Зачем вы это делаете? Что такое 'void * ', исходящий из (некоторые' dlsym'?). Обратите внимание, что замыкания больше одного указателя. –

+0

Некоторые dsystem lib. Если бы мне не пришлось. Я бы не сделал этого – Mumfordwiz

+0

Невозможно сохранить 'void *' в 'std :: function', потому что он не может быть вызван. Ваш вызов 'target' всегда будет возвращать нулевой указатель. –

ответ

2

Вы не можете.

Вы можете указать указатель данных на void*, а затем вернуться к тому же типу указателя, с которого вы начали. std::function не является типом указателя, поэтому листинг статически недействителен, и это не то же самое, с которого вы начали. Вы начали с .target типа void(*)(), но это не указатель данных, это указатель на функцию, поэтому его отличное от void* и обратно определено по реализации.

Вы можете:

  1. Игнорировать проблему и приведение к void(*)() в любом случае. Будет работать на большинстве (но не на всех) платформах.
  2. Использовать void(*)() вместо void* как универсальный указатель функции (yoy может передавать его другим типам функций).
  3. Используйте любые инструменты, предлагаемые C++, чтобы полностью исключить их.
+0

Thants .. приятно знать .. – Mumfordwiz