[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 á laConstMyStruct
drumrum?
-
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.
-
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 aufconst 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 einT*
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 einT*
Wir waren bei
T* const
.
-
@john-0
Aha