Addresse von std::function ausgeben [Erledigt]



  • Hallo,
    ich wollte meine Überschrift knapp halten. Eigentlich will ich nicht die Adresse von std::function ausgeben, sondern von der darunter referenzierten Funktion.
    Ich habe auf Stackoverflow einen vielversprechenden Ansatz gefunden, allerdings versagt er bei Lambda-Ausdrucken. So wird für f3() keinerlei Adresse ausgegeben:

    #include <iostream>
    #include <functional>
    
    using namespace std;
    
    template<typename T, typename... U>
    size_t getAddress(std::function<T(U...)> f) {
        typedef T(fnType)(U...);
        fnType ** fnPointer = f.template target<fnType*>();
        return (size_t) *fnPointer;
    }
    
    void foo(int& a) {
        a = 0;
    }
    
    
    int main() {
        std::function<void(int&)> f = &foo;
        auto f2 = f;
        std::function<void(int&)> f3 = [](int &a){ a = 3;};
        
        std::cout << getAddress(f) << std::endl;
        std::cout << getAddress(f2) << std::endl;
        std::cout << getAddress(f3) << std::endl;
        
        return 0;
    }
    

    Hier kann man rumspielen.
    Und laut Doku sollte das doch auch funktionieren.

    Weiß jemand weiter?

    Danke im Voraus!
    Steffo


  • Mod

    Hast Du die Doku genau gelesen?



  • @Columbo sagte in Addresse von std::function ausgeben:

    Hast Du die Doku genau gelesen?

    Beziehst du dich auf das?

    A pointer to the stored function if target_type() == typeid(T), otherwise a null pointer.

    Ich hätte gedacht, dass der Target-Typ auch bei einem Lambda identisch ist, solange die Signatur gleich ist.



  • Funktionen können „inline“ sein, bei normalen Funktionen muss man das explizit setzen, wenn man Lambda nutzt nicht. D.h. der Compiler darf den Aufruf komplett eliminieren und den Code direkt einfügen, so dass da auch keine Adresse mehr vorhanden ist.



  • @john-0 Oha! Danke, für die Aufklärung! Dann muss ich das wohl mit dem klassischen Observer-Pattern lösen, wo die Adresse einer Instanz übergeben wird.


Anmelden zum Antworten