2017-02-19 2 views
-1

Ich habe ein Problem. Ich versuche, eine void * in std :: -Funktion zu konvertieren. Dies ist nur ein einfaches Beispiel, werden alle VorschlägeCasting void * zu Std :: Funktion

#.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; 
    } 

Jedes Casting Ich habe versucht, funktionierte nicht geschätzt werden.

Ich weiß, dass ich in diesem Beispiel eine std::function senden kann, aber es ist für etwas größeres und ich arbeite an einem Beispiel, um es hier arbeiten zu lassen.

Die ganze Bedeutung von void*, ist für manchmal zu verwenden, in diesen Situationen, wenn Sie nicht wissen, was Sie erhalten werden, und dann werfen Sie es auf die spezifische Verwendung, die Sie benötigen.

Danke!

+1

Warum tun Sie das? Von was kommt die 'void *' (etwas 'dlsym'?). Beachten Sie, dass Verschlüsse größer als ein Zeiger sind. –

+0

Einige dsystem lib. Wenn ich nicht müsste. Ich hätte es nicht getan – Mumfordwiz

+0

Es ist nicht möglich, ein 'void *' in einer 'std :: function' zu speichern, weil es nicht aufrufbar ist. Ihr Aufruf an "target" gibt immer einen Nullzeiger zurück. –

Antwort

2

Sie können nicht.

Sie können einen Datenzeiger auf void* und dann auf den gleichen Zeigertyp umwandeln, mit dem Sie begonnen haben. std::function ist kein Zeigertyp, daher ist der Cast statisch ungültig und es ist nicht das Gleiche, mit dem Sie begonnen haben. Sie haben mit einem .target vom Typ void(*)() gestartet, aber es ist kein Datenzeiger, es ist ein Funktionszeiger, also wird es in die void* und zurück umgewandelt.

Sie können:

  1. ignorieren das Problem und gegossen zu void(*)() sowieso. Wird auf den meisten (aber nicht allen) Plattformen funktionieren.
  2. Verwenden Sie void(*)() anstelle von void* als universellen Funktionszeiger (yoy kann es auf andere Funktionstypen umwandeln).
  3. Verwenden Sie alle Tools, die C++ bietet, um den Cast insgesamt zu vermeiden.
+0

Thants .. gut zu wissen .. – Mumfordwiz