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! 🙂


Log in to reply