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 wirdIst 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.