dlopen + template Funktionen in std::function



  • Ich habe eine Klasse A, in die ich gerne Funtionen als Memberfunktionen mittels dlopen laden würde. Ganz grob skizziert:

    // File A.h
    class A
    {
    public:
      int x;
      std::vector<std::function<void()>> functions;
    };
    
    // Another File
    // this method should be loaded dynamically
    void print()
    {
      std::cout << x << std::endl;
    }
    

    Es sind also nun mehrere Sachen, die ich gerne hätte:

    * print sollte als Member-Funktion aufgerufen werden können
    * print sollte in den Vektor aufgenommen werden
    * print muss dynamisch geladen werden können, da Code zur Laufzeit erzeugt wird

    Ist so etwas möglich?

    Als Krönuing wäre noch toll, wenn die zu ladenden Funtionen Templates unterstützen:

    template <typename T>
    void print2()
    {
      // einfach mal annehmen dass das geht:
      T t(x);
      std::cout << t;
    }
    


  • 1. Templates existieren kompiliert nicht mehr, sind ja (wie der Name sagt) nur Vorlagen, aus denen der Compiler Funktionen/Klassen generiert.

    void print_int() {
       print2<int>();
    }
    

    ist die einzige Lösung hierfür.

    2. print soll als Memberfunktion von was aufgerufen werden? A? Dann musst du print entweder als Membervariable in A packen statt einem vector eine map nehmen und zur Laufzeit nachschlagen ala

    std::map<std::string, std::function<void()>> functions;
    
    void A::print() {
        functions.find("print")->second(); // Fehlerbehandlung fehlt
    }
    

    3. Dafür musst du dlsym bemühen.

    void* handle = dlopen(...);
    functions.push_back(reinterpret_cast<void(*)()>(dlsym(handle, "print")));
    

    4. Dafür ist dlsym da.


Anmelden zum Antworten