Ich hätte mal eine Aufgabe für deine "ach-so-tollen" C++-Skills:
Mach eine generische Klasse, die zwei Werte hält: eine Liste von einer generischen Klasse, die gleich noch definiert wird und einem Wert für den generischen Typen.
Die andere generische Klasse soll ein
Damit du weißt, dass es in .NET bestens funktioniert:
C#
Also: mach es mir in C++ nach! Wenn du das geschafft hast, mach mit Lambda-Ausdrücken weiter:
Mach eine generische Klasse, die zwei Werte hält: eine Liste von einer generischen Klasse, die gleich noch definiert wird und einem Wert für den generischen Typen.
Die andere generische Klasse soll ein
Dictionary<string, anderegenerischeklasse>
enthalten und die einzige Möglichkeit, auf Parameter innerhalb der Klasse zuzugreifen ist ein Indexer. Dieser Indexer soll: einen Baum nach unten verfolgen, einen Wert aus dem eigenen Dictionary zurückgeben und entsprechend auch setzen können. Sollte null
übergeben werden, soll der letzte Pfad gelöscht werden.Damit du weißt, dass es in .NET bestens funktioniert:
C-Quellcode
- /*
- This source code may not be used without permission of the author!
- Please contact him if you want the permission to use or modify it!
- */
- public class Settings<T> {
- private Dictionary<string, SettingsItem<T>> settings;
- public Settings() {
- settings = new Dictionary<string, SettingsItem<T>>();
- }
- public SettingsItem<T> this[string name] {
- get {
- return this[name.Split(Path.PathSeparator)];
- }
- set {
- this[name.Split(Path.PathSeparator)] = value;
- }
- }
- public SettingsItem<T> this[params string[] name] {
- get {
- Queue<string> queue = new Queue<string>(name);
- string item = queue.Dequeue();
- if (!settings.ContainsKey(item))
- throw new KeyNotFoundException();
- if (queue.Count > 0)
- return this[item].Setting[queue.ToArray()];
- else
- return this[item];
- }
- set {
- Queue<string> queue = new Queue<string>(name);
- string item = queue.Dequeue();
- if (settings.ContainsKey(item)) {
- if (queue.Count > 0)
- this[item].Setting[queue.ToArray()] = value;
- else {
- if (value == null)
- settings.Remove(item);
- else
- settings[item] = value;
- }
- } else
- if (queue.Count > 0)
- settings.Add(item, new SettingsItem<T>(new Settings<T>()));
- else
- if (value != null)
- settings.Add(item, value);
- }
- }
- public bool ContainsKey(string name) {
- return ContainsKey(name.Split(Path.PathSeparator));
- }
- public bool ContainsKey(params string[] name) {
- Queue<string> queue = new Queue<string>(name);
- string item = queue.Dequeue();
- if (!settings.ContainsKey(item))
- return false;
- if (queue.Count > 0)
- return settings[item].Setting.ContainsKey(queue.ToArray());
- else
- return true;
- }
- }
- public class SettingsItem<T> {
- public Settings<T> Setting {
- get;
- set;
- }
- public T Value {
- get;
- set;
- }
- public SettingsItem(Settings<T> setting) {
- this.Setting = setting;
- }
- public SettingsItem(T value) {
- this.Value = value;
- }
- }
Also: mach es mir in C++ nach! Wenn du das geschafft hast, mach mit Lambda-Ausdrücken weiter: