Named Parameters mit Ableitung



  • Nehmen wir die Klassenhierarchie als gegeben:

    struct base
    {
    	int m_i;
    };
    
    struct derived : base
    {
    	double m_d;
    };
    

    Zuerst schreiben wir ein paar Attribut-Klassen, um den Objekten einen Wert zuzuweisen:

    struct attribute_i
    {
        explicit attribute_i(int i)
        : m_i(i)
        {
        }
    
        template <typename T>
        void modify(T& target) const
        {
           target.m_i = m_i;
        }
    
        int m_i;
    };
    
    // Analog für andere wie attribute_d. Wenn es zu viel Code wird, 
    // verwende Makros
    

    Um eine schöne Syntax zu ermöglichen, überladen wir den operator<< . Dabei habe ich std::enable_if verwendet, damit der Operator nicht für sämtliche Argumenttypen im Namensraum herangezogen wird.

    #include <type_traits>
    
    template <typename T, typename A>
    typename std::enable_if<std::is_base_of<base, T>::value, T&>::type operator<< (T& target, A attribute)
    {
        attribute.modify(target);
        return target;
    }
    

    Anwendung:

    int main()
    {
    	base b;
    	b << attribute_i(2);
    
    	derived d;
    	d << attribute_i(3) << attribute_d(4.5);
    }
    


  • Hallo,

    dot schrieb:

    Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...

    Bei den Klassen handelt es sich um Teile eines Abstraktions-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden viele und viele verschiedene Parameter gesetzt. Daran läßt sich erst einmal wenig ändern.

    @Nexus:
    Danke für den interessanten Ansatz. Den werde ich genauer anschauen!





  • 314159265358979 schrieb:

    http://img4.fotos-hochladen.net/uploads/void666tujm5byvnr.png
    *angst hab*

    Der Teufel benutzt void* Zeiger? Interessant... der Code ist bestimmt die Hölle 🤡



  • Meine Güte, schafft ihr es auch mal, einen Thread nicht vollzuspammen?



  • void* schrieb:

    dot schrieb:

    Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...

    Bei den Klassen handelt es sich um Teile eines Abstraktions-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden viele und viele verschiedene Parameter gesetzt. Daran läßt sich erst einmal wenig ändern.

    hmmm



  • dot schrieb:

    void* schrieb:

    dot schrieb:

    Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...

    Bei den Klassen handelt es sich um Teile eines Abstraktions-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden viele und viele verschiedene Parameter gesetzt. Daran läßt sich erst einmal wenig ändern.

    hmmm

    Hmmm?

    Gemeint sind Parameter wie Größe, Position, Farben, Fonts, Initialisierungswerte für den Inhalt von Steuerelementen (Texte), Beschriftungen, ... eben die diversen Properties, die für ein Widget gesetzt werden können. Und da der Code teilweise 20 Jahre auf dem Buckel hat, viele Entwickler dran rumgeschraubt haben, von Unix auf Windows portiert wurde und sonst einiges mitgemacht hat, ist die Benutzung der Grundlagenbibliotheken eben etwas inhomogen.
    Und mit viele verschiedene Parameter ist eben gemeint, dass z.B. bei einer Combo-Box mal 7 Werte gesetzt werden und einmal 9, wovon 5 gleich sind wie beim ersten Aufruf und 4 eben anders.



  • void* schrieb:

    dot schrieb:

    void* schrieb:

    dot schrieb:

    Ich würd mir an deiner Stelle zuerst mal überlegen, ob die große Anzahl an Parametern in deinen Konstrukturen nicht vielleicht ein Hinweis sein könnte, dass deine Klasse zuviel tut und diese Klasse daher möglicherweise vielleicht eigentlich mehrere Klassen sein sollte...

    Bei den Klassen handelt es sich um Teile eines Abstraktions-Layers für verschiedene (z.T. alte) UI-Frameworks und da werden viele und viele verschiedene Parameter gesetzt. Daran läßt sich erst einmal wenig ändern.

    hmmm

    Hmmm?

    Gemeint sind Parameter wie Größe, Position, Farben, Fonts, Initialisierungswerte für den Inhalt von Steuerelementen (Texte), Beschriftungen, ... eben die diversen Properties, die für ein Widget gesetzt werden können.

    Und da liegt der Hund begraben. Muss das alles in eine Klasse? Kann das nicht in Datenstrukturen unterteilt werden? Das ist eben unschönes Design...



  • Unabhängig davon, ob es gutes Design ist, oder nicht: Named Parameter Idiom. Ist also ne durchaus "gängige" Lösung, so wie der TO es macht. Häßlich ist es allemal.



  • Ich denk mal, dass die vielen Parameter an sich schon unschönes Design offenlegen, wurde jetzt genug bekrittelt.
    Wenn du darauf bestehst, es so zu machen, gibts aber wohl keine viel elegantere Möglichkeit als die von dir schon genannte CRTP-Version oder etwas wie das, was Nexus angesprochen hat.


Anmelden zum Antworten