[Gelöst] template class mit const/non-const Attributen



  • Hi,

    ich bastel gerade etwas und stehe vor diesem Problem:

    template<typename T>
    struct MyStruct
    {
        T* Data = nullptr;
    
        MyStruct() = default;
        MyStruct( T* data ) : Data( data )
        {
        }
    
        // ... weitere Methoden
    };
    

    Jetzt möchte ich das template auch für const Pointer benutzen, wie komme ich da um Codeduplizierung á la ConstMyStruct drumrum?


  • Mod

    Da Pointer auf const schon funktioniert, nehme ich an, du meinst dass der Zeiger Data selbst const sein soll? Aber wozu soll das gut sein? Oder meinst du doch einen Pointer auf const und hast nicht gemerkt, dass das schon geht?



  • :facepalm

    Da stand ich wohl komplett auf´m Schlauch... mit

    MyStruct<int const> obj;
    

    habe ich ja genau das, was ich möchte, und der Compiler erzeugt Fehler, wenn ich non-const Methoden aufrufe. Aus irgendwelchen Gründen wollte ich, dass

    int const arr[20];
    MyStruct<int> obj( arr );
    

    intern einen Pointer auf const benutzt, statt einen non-const Pointer.



  • @DocShoe sagte in template class mit const/non-const Attributen:

    intern einen Pointer auf const benutzt, statt einen non-const Pointer.

    Das würde ja gerade mit Deinem Ansatz des Default Constructors nicht funktionieren. Sicherlich kann man das anders entwerfen, aber dann muss das Design der ganzen Klasse dazu passen.



  • @john-0

    Ja, das wollte ich, brauche ich aber nicht. Intern bleibt´s ein Pointer auf T, aber wenn der Template Parameter const ist kann ich´s so benutzen:

    int main()
    {
       int a1[20];
       MyStruct<int> ms1( a1 );
    
       int const a2[20];
       MyStruct<int const> ms2( a2 );
    }
    


  • Man kann sicherlich mit Template Metaprogramming dafür eine Lösung finden. Es ist natürlich auch eine Frage wie man das Template Design machen will. Mittlerweile gibt es den Trend, dass die Templates ohne explizite Instanzierung nutzbar sein sollen. D.h.

    int main () {
        int a1[20];
        MyStruct ms1 (a1);
    }
    

    sollte funktionieren.

    Das was Du bei ms2 machst ist aber kein const Pointer, sondern ein Pointer auf const T. Das kann man natürlich auch machen.



  • Ja, da waren wir vorhin schon. Prinzpiell spielt es keine Rolle, ob intern ein T const* benutzt wird, oder ein T* mit einem konstanten Objekt drumrum. Mir geht es um das Verhalten der Klasse, nicht um die tatsächliche Implementierung.
    Und mit C++11 funktioniert automatic template argument deduction nicht.



  • @DocShoe sagte in [Gelöst] template class mit const/non-const Attributen:

    Ja, da waren wir vorhin schon. Prinzpiell spielt es keine Rolle, ob intern ein T const* benutzt wird, oder ein T*

    Wir waren bei T* const.



  • @john-0
    Aha


Log in to reply