Variablennamen beliebigen Typs ausgeben
-
Möchte den Namen einer beliebigen Variable ausgeben und auch einen Wert einlesen, insofern der default Wert geändert werden soll. Habe mir dazu so etwas gebastelt:
#include <iostream> #include <sstream> #include <string> using namespace std; #define PRINTER(name) printer(#name, (&name)) float f_VariableA = 0.5; float f_VariableB = 1.5; int i_VariableC = 3; int i_VariableD = 4; void printer(string name, void *value) { string input; if (name.rfind("f_", 0) == 0) { cout << "Please enter a value for " << name << " [default = " << *(float *)value << "]:" << endl; getline(cin, input); if (!input.empty()) { istringstream stream(input); stream >> *(float *)value; } } else if (name.rfind("i_", 0) == 0) { cout << "Please enter a value for " << name << " [default = " << *(int *)value << "]:" << endl; getline(cin, input); if (!input.empty()) { istringstream stream(input); stream >> *(int *)value; } } } int main() { PRINTER(f_VariableA); PRINTER(i_VariableC); cout << f_VariableA << endl; cout << i_VariableC << endl; return 0; }
Aber das Problm dabei, dass ich vor jede Variable den Typ schreiben muss (f_ für float und i_ für int). Wie ginge das besser?
-
Du könntest das mit einer Template-Funktion machen (anstatt void*)?
#include <iostream> #include <sstream> #include <string> #include <string_view> using namespace std; #define PRINTER(name) printer(#name, (name)) float VariableA = 0.5; float VariableB = 1.5; int VariableC = 3; int VariableD = 4; template<class T> void printer(std::string_view name, T& value) { string input; cout << "Please enter a value for " << name << " [default = " << value << "]:" << endl; getline(cin, input); if (!input.empty()) { istringstream stream(input); stream >> value; } } int main() { PRINTER(VariableA); PRINTER(VariableC); cout << VariableA << endl; cout << VariableC << endl; return 0; }
In der Praxis würde ich aber so etwas eher nicht verwenden (allein schon weil es ein Makro verwendet)...
-
@HarteWare , Danke, das klappt prima. Danach hatte ich gesucht. Nur was bedeutet dieses string_view? Und auf das Makro will ich nicht verzichten, nur so schreib ich nix doppelt.
Gibt es wohl reflection in C?
& noch angenehmen Restfeiertag!
-
@EinNutzer0 sagte in Variablennamen beliebigen Typs ausgeben:
Nur was bedeutet dieses string_view?
Geh auf cppreference.com und gib string_view in der Suche ein. -> hier https://en.cppreference.com/w/cpp/string/basic_string_view
Lies auch: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#SS-string
Gibt es wohl reflection in C?
Nicht wirklich. Es gibt sowas wie type_info und allgemein siehe https://en.cppreference.com/w/cpp/types
Es gibt aber eine Arbeitsgruppe (SG7), die sich damit befasst. Den Stand von 2016 hat Axel hier beschrieben: https://root.cern.ch/blog/status-reflection-c, aber da müsstest mit diesen Suchbegriffen weitersuchen oder hoffen, dass sich hier jemand anderes dazu meldet.
-
Danke & Thema gelöst!