Frohe Oster, sehr geehrte Community! Ich schreibe gerade auf dem Arduino ein kleines Programm. Und möchte über ein Terminal (Putty) Variablen ändern Funktionen aufrufen durch Verzeichnisse navigieren. Damit ich nicht alles in Spaghetti schreiben wollte. Jetzt zu meinem Problem: Bspl: template <typename T, typename P> class Container { public: String Name;//Terminal Name des Wertes T Value;//Enthaltener Wert P *Pointer;//Soll auf das nächste Container Objekt verweisen ! ;) }; Und da habe ich jetzt natürlich das Problem: Container<int,Container < bool,Container <............. Ich wollte halt von diesem Container auf den nächsten verweisen der seiner Seits ja auch auf einen Verweist usw! Habe mich ein weinig fest gefranzt. Kreative neue Denkansätze erwünscht. Gruß Meik
:
Verschoben durch Moderator
..ich sehe zwar keine konkrete Frage aber die Antwort ist trotzdem Vererbung und Abstraktion. HTH
Meik Juenke schrieb: > Und da habe ich jetzt natürlich das Problem: > > Container<int,Container < bool,Container <............. > > Ich wollte halt von diesem Container auf den nächsten verweisen der > seiner > Seits ja auch auf einen Verweist usw! Und was ist dabei das Problem? Ist eine ganz normale verkettete Liste
Danke für die schnellen Antworten Also doch Tippen.. Das Problem ist das es verdammt viele verschiedene Typen durch die Template Kombinationen zustande kommen. Halt nicht einfach Vektor und gut. Eine Template das als Parameter ein Template erhält das seiner seits weider ein Template erhält....
:
Bearbeitet durch User
Kennst du schon std::tuple ? http://en.cppreference.com/w/cpp/utility/tuple Da du aber scheinbar einen Container brauchst der viele Variablen unterschiedlichen Typs enthält, kann man da nicht viel machen, denn du musst ja alle Typen irgendwo angeben...
So etwas hab ich in Java gesehen. Listen von Maps von Listen von Listen von Maps oder so ähnlich. Bin zu der Meinung gekommen: Am besten den Erfinder erschlagen und von Grund auf neu anfangen.
1 | QMap<QString, QVariant> |
2 | oder eine beliebige liste. |
bzw eine boost variante des ganzen. Prinzipiell ist es meist eine schlechte Idee, die Containerstructur (bei dir Link auf nächstes Element) mit den Daten (bei dir Key-Value-Pair) zu vermixen. Wenn man das ganze unbedingt selber schreiben will, dann eine Klasse, die genug speicher für den größsten möglichen Typen enthält (oder wenns noch abstracter sein soll, einen void pointer) und ein feld, was den Typ speichert. mittels Template zugriffsfunktionen, die den Typ checken (zb via type traits) kannst du dein OBjekt wieder rausholen.
1 | template <class T> |
2 | class MyVariantTypeId{ |
3 | enum { id = -1 }; |
4 | }
|
5 | |
6 | |
7 | template <> |
8 | class MyVariantTypeId<bool>{ |
9 | enum { id = 0 }; |
10 | }
|
11 | template <> |
12 | class MyVariantTypeId<int8>{ |
13 | enum { id = 1 }; |
14 | }
|
15 | class MyVariant |
16 | {
|
17 | public:
|
18 | template <class T> |
19 | bool set( const T& v){ |
20 | if ( sizeof(T) <= MAX_VAR_BYTES){ |
21 | m_type= MyVariantTypeId<T>::id; |
22 | *((T*)m_data) = v; |
23 | return true; |
24 | }
|
25 | return false; |
26 | }
|
27 | |
28 | template <class T> |
29 | const T* get(){ |
30 | m_data = MyVariantTypeId<T>::id; |
31 | if (MyVariantTypeId<T>::id == m_type){ |
32 | return ((T*)m_data); |
33 | }
|
34 | return nullptr; |
35 | }
|
36 | |
37 | private:
|
38 | int m_type; |
39 | uint8_t m_data[MAX_VAR_BYTES]; |
40 | }
|
Edit: der Code ist jetzt nur so runtergetippt, um das Prinzip zu verdeutlichen. Kann sein, dass er fehler enthält. Sowohl syntaktischer, als auch logischer Natur
:
Bearbeitet durch User
Ist soetwas gewünscht?
1 | class basic_container { |
2 | public:
|
3 | String Name;//Terminal Name des Wertes |
4 | basic_container *Pointer;//Soll auf das nächste Container Objekt verweisen ! ;) |
5 | };
|
6 | |
7 | template <typename T> |
8 | class Container : public basic_container { |
9 | public:
|
10 | T Value;//Enthaltener Wert |
11 | };
|
Moin, ihr habt mir sehr weiter geholfen. Ich habe zwar keinen der Vorschläge direkt umgesetzt. Aber der "Denkanstoß" kam! Und ich habe mein altes Konzept über den Haufen geschmissen! An dieser Stelle erstmal danke! :) Da die Befehle vom Terminal als String weiter verarbeitet werden. Setze ich Polymorphie ein. Eine Basis Klasse die virtual Methoden hat und als Parameter String erwartet. Und von ihr zB eine Template Klasse ableite. So kann immer über den gleichen Typ (Basis) Zeiger auf alle relevanten Methoden der verschiedenen Objekte zugegriffen werden. So die IDEE! ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.