Hilfsfunkionen... So oder anders?



  • Hallo,

    Ich bin mir etwas unsicher mit Hilfsfunktionen, allgemein.
    Früher hätte ich static functions in einem Namespace gemacht.
    Aber ein Arbeitskollege meinte, so wie unten im Bsp, mit überladenen () operator, wäre es "besser", weil es in einer classe ist.

    Er ist sehr Wortkarg, wenn es prezise Erklärungen geht.

    Was meinen die Profis unter euch?
    Wie macht ihr es?

    lg
    Alex

    PS: Pseudocode

    namespace util {
    namespace string {
    class ToString {
    public:
        ToString() = default;
        ToString(const ToString&) = delete;
        ToString(ToString&&) = delete;
    
        std::string operator()(const std::string& str) const {
            return str;
        }
    
        template<class T, typename = detail::if_arithmetic<T>>
        std::string operator()(const T str) const {
            return std::to_string(str);
        }
    
        template<class T, typename = detail::if_cont<T>>
        std::string operator()(const T &str) const {
            return std::string(str.begin(), str.end());
        }
    
        std::string operator()(const char* str) const {
            return std::string(str);
        }
    
        std::string operator()(const wchar_t* str) const {
            std::wstring wstr(str);
            return std::string(wstr.begin(), wstr.end());
        }
    
        std::string operator()(...) const {
            return "";
        }
    };
    } /* namespace string */
    } /* namespace utils */
    

    Verwendung:

    main() {
       std::cout << util::string::ToString()(5) << std::endl;
       std::cout << util::string::ToString()("Hello") << std::endl;
       std::cout << util::string::ToString()(1L) << std::endl;
    }
    


  • Hallo,

    HierKommtAlex schrieb:

    Was meinen die Profis unter euch?

    Du hast doch schon selber Profis zitiert:

    HierKommtAlex schrieb:

    return std::to_string(str);



  • HierKommtAlex schrieb:

    Früher hätte ich static functions in einem Namespace gemacht.
    Aber ein Arbeitskollege meinte, so wie unten im Bsp, mit überladenen () operator, wäre es "besser", weil es in einer classe ist.

    namespace. mit inline statt static.



  • Jockelx schrieb:

    Du hast doch schon selber Profis zitiert:

    HierKommtAlex schrieb:

    return std::to_string(str);

    Versteh dich grad nicht.
    to_string ist ein profi?

    unskilled schrieb:

    HierKommtAlex schrieb:

    Früher hätte ich static functions in einem Namespace gemacht.
    Aber ein Arbeitskollege meinte, so wie unten im Bsp, mit überladenen () operator, wäre es "besser", weil es in einer classe ist.

    namespace. mit inline statt static.

    Hab ich vor kurzem wieder mal gelesen, dass man das bei variablen machen soll.
    hast du eine begründung dafür?
    oder machst du es einfach so?



  • Was ist an operator() mit Klasse besser als toString() ohne?



  • manni66 schrieb:

    Was ist an operator() mit Klasse besser als toString() ohne?

    Es ist gekapselt 😃
    Mehr Vor/Nach-teile sehe ich daran nicht.

    Wenn ich jetzt noch die anderen helfer(ToWstring,ToType) hinzu nehme, sieht
    es mit Klassen übersichtlicher aus.



  • Es erschließt sich mir nicht, was daran besser sein soll, erst ein Objekt erzeugen zu müssen, das gar keinen State hat, nur damit ich eine Funktion aufrufen kann. Klingt für mich auch nicht nach Kapselung, sondern nach Sinnbefreitheit - mal ganz abgesehen von der besch... Syntax mit Doppelklammerpaar. Womöglich kommt noch jemand auf die Idee, ein StringUntilSingleton zu ergeugen :p



  • HierKommtAlex schrieb:

    manni66 schrieb:

    Was ist an operator() mit Klasse besser als toString() ohne?

    Es ist gekapselt 😃

    Was ist denn wie besser gekapselt?



  • HierKommtAlex schrieb:

    Jockelx schrieb:

    Du hast doch schon selber Profis zitiert:

    HierKommtAlex schrieb:

    return std::to_string(str);

    Versteh dich grad nicht.
    to_string ist ein profi?

    Die 'Profis' der stl haben to_string nicht in eine Klasse gepackt.
    Das meinte ich damit.



  • manni66 schrieb:

    HierKommtAlex schrieb:

    manni66 schrieb:

    Was ist an operator() mit Klasse besser als toString() ohne?

    Es ist gekapselt 😃

    Was ist denn wie besser gekapselt?

    http://cgvr.cs.uni-bremen.de/progr/Scott%20Meyers%20-%20How%20Non-Member%20Functions%20Improve%20Encapsulation.pdf



  • temi schrieb:

    manni66 schrieb:

    HierKommtAlex schrieb:

    manni66 schrieb:

    Was ist an operator() mit Klasse besser als toString() ohne?

    Es ist gekapselt 😃

    Was ist denn wie besser gekapselt?

    http://cgvr.cs.uni-bremen.de/progr/Scott%20Meyers%20-%20How%20Non-Member%20Functions%20Improve%20Encapsulation.pdf

    Wenn du das gelesen und verstanden hast, kannst du dann ja mal erklären, wo der Bezug zu dem hier gezeigten Konstrukt ist.


  • Mod

    temi schrieb:

    manni66 schrieb:

    HierKommtAlex schrieb:

    manni66 schrieb:

    Was ist an operator() mit Klasse besser als toString() ohne?

    Es ist gekapselt 😃

    Was ist denn wie besser gekapselt?

    http://cgvr.cs.uni-bremen.de/progr/Scott%20Meyers%20-%20How%20Non-Member%20Functions%20Improve%20Encapsulation.pdf

    In Meyers Essay geht es um eine andere Frage: Meyers hat bereits eine Klasse und stellt die Frage, wie eine Funktion ausssehen sollte, die mit einem Objekt dieser Klasse arbeiten soll.

    HierKommtAlex dagegen erfindet die Klasse überhaupt erst, nur um eine Funktion aufzurufen. Dafür ist kein Grund ersichtlich.



  • camper schrieb:

    In Meyers Essay geht es um eine andere Frage: Meyers hat bereits eine Klasse und stellt die Frage, wie eine Funktion ausssehen sollte, die mit einem Objekt dieser Klasse arbeiten soll.

    HierKommtAlex dagegen erfindet die Klasse überhaupt erst, nur um eine Funktion aufzurufen. Dafür ist kein Grund ersichtlich.

    Tut mir leid, falls ich mich geirrt habe. Ich wollte nur eine Antwort auf die Frage geben.

    Was ist denn wie besser gekapselt?

    Meyers sagt: Bevorzuge nicht befreundete Nichtelementfunktionen gegenüber Elementfunktionen. Sie erhöhen den Grad der Kapselung.

    Wenn ich eigens eine Klasse erfinden muss, um Elementfunktionen zu erhalten, dann habe ich das Gegenteil gemacht.


Anmelden zum Antworten