Variablenmanager in Konsole
-
Hallo Leute, zuerst meine Inspiration zu der Idee:
Ich arbeite lange mit einer 3D Engine und beim Debug nervt es sehr irgendwelche Variablen jeden Frame neu in die Konsole einzutragen, sodass man eine schöne Liste von Werten hat.
Da ich selbst eine schreibe und gerade die Konsole fertiggestellt habe möchte ich dieser einen Bereich zur Ausgabe von Varibalen bzw. Debuginformation geben.
Es soll so aussehen, dass man z.B Engine::GConsole::Inst()->ManageValue("Das Auto fährt:", meineVariable); einträgt und dann in dem Manager in der Listbox ein Eintrag gemacht wird und sich jedes Frame der Wert mitverändert, sodass man eine schöne Debugleiste hat wo man Debuginformationen auslesen kann.Jetzt würde ich dafür eine std::map erstellen : std::map< int , std::pair< String, (Typ)> > und zwar soll das int als index für die Listbox dienen, der String ist dann die Information ( z.B "Das Auto fährt") und jetzt hab ich ein Problem mit dem Typ der Variable. Ich möchte ja z.B int,float,double eigene Vectoren ausgeben und kann keine statische map verwenden und würde mal gerne wissen wie man das machen könnte.Ich habe mir überlegt alle Werte erst in Strings zu konvertieren aber ich brauche ja einen Pointer auf die Variable um beim Update den aktuellen Wert darstellen zu können.
Ich weiß das war jetzt viel Informatiobn aber ich hoffe ihr könnt mir da weiterhelfen.
Danke
-
Ohh man mir fallen gerade Templates ein.Müsste es damit funktionieren ??
-
Du koenntest einen Zeiger auf die Variable sowie einen Zeiger auf eine Funktion, die diese ausgibt in einer map speichern. Ich dachte da an sowas, ungefaehr:
#include <iostream> #include <string> #include <unordered_map> #include <utility> struct variable_printer { template <typename T> void insert(std::string const& name, T& ref) { variables_[name] = std::make_pair(&ref, &print_impl<T>); } void print(std::string const& what) const { auto iter = variables_.find(what); if(iter != variables_.end()) iter->second.second(iter->second.first); // else ... } private: typedef void const volatile variable; template <typename T> static void print_impl(variable* ptr) { std::cout << *static_cast<T*>(ptr); } std::unordered_map<std::string, std::pair<variable*, void (*) (variable*)>> variables_; }; int main() { variable_printer printer; int const volatile i = 42; printer.insert("i", i); printer.print("i"); }
-
-
Wow danke für die schnelle Antwort.Das mit dem void pointer macht schon Sinn, Danke

-
Hei ich hätte da noch eine Frage dazu.Ich würde auch gerne manuell irgendetwas ausgeben könne, wie z.B wenn man einen Vector (selbstgeschrieben ) einsetzt, der dann halt die 3 Werte ausgeben soll.Jetzt ist das Beispiel mit Templates und der wird das nicht convertieren können wie ich wes will.
Muss ich hier ganz anders rangehen und mit überladenen Funktionen arbeiten??
Oder gibts da eine andere Lösung für
Danke
-
Schreib halt nen operator << fuer vector.
-
Hallo.
Ich hätte zu dem Code, den Kellerautomat geposted hat eine Frage.
Was bedeutet dieses Konstrukt:typedef void const volatile variable;Ich habe mir einmal durchgelesen was
volatilebedeutet. Wenn ich jedoch diese Verwendung sehen, vermute ich das ich es doch nicht verstanden habe. Was ist das eigentlich für ein Datentyp:void const volatileSo was habe ich noch nie gesehen, darum würde mich interessieren, was das ist und warum das hier so gemacht wurde.
So wie ich das verstehe, ist das ein leerer konstanter, vom Kompiler nicht optimierbarer Datentyp... Mmh, Das hört sich irgendwie nicht richtig an.
Grüße