Ich möchte eine template-struct für Variablen bauen, die so zu verwenden ist, wie es die Variable alleine wäre, aber zwingend ein weiteres Datenfeld enthält. Also habe ich definiert:
Da noch nichts, es sollte irgendwo dann hystSteps = 5; stehen können. Theorie: hystSteps im int-Kontext benutzt sollte die am besten passende Konversion benutzen, also uint8_t& operator uint8_t().
Wenn du hystSteps als lvalue nutzen möchtest, wirst du den Zuweisungsoperator überschreiben dürfen.
Der Cast Operator hilft dir nur bei der Verwendung als rvalue.
ESP ist doch auch schon bei C++14 oder C++17 ? ! ?
Interessant - wenn ich die Deklaration wie Du auf der globalen Ebene mache, geht es tatsächlich genauso fehlerfrei. Was ich bisher verschwiegen hatte - weil ich dachte, dass das irrelevant sei - ist, dass die Deklaration bei mir innerhalb einer weiterenstruct-Definition steht:
template<typename T> class SetP {
protected:
T value;
const char *name;
public:
SetP() = delete;
explicit SetP(const char *n) : value(0), name(n) {}
T& operator T() { return value; }
T operator=(T inv) { return (value = inv); }
const char *getName() { return name; }
};
SetP<uint8_t> th("bla"); // <===== Das geht durch!
struct SetData {
uint16_t magicValue;
SetP<uint8_t> hystSteps("CV5"); // <=== Das hier aber nicht!
...
} settings;
Kurz nachgesehen, in mich gegangen und überprüft....
Die korrekte Begründung lautet so:
Dein Problem ist, dass
SetP<uint8_t> hystSteps("CV5");
nicht als Definition einer Variablen vom Compiler erkannt wird, sondern als Methoden Prototype, als Vorwärtsreferenz.
Darum wird auch ein Datentype in der runden Klammer verlangt.
Das ist natürlich nicht das, was du dir wünscht.
Bei Verwendung der geschweiften Klammer MUSS es eine Instanziierug einer Variablen sein. Es kann kein Methoden Prototype sein.
Ich habe die Idee aber inzwischen wieder ad acta gelegt, denn wenn ich die struct settings binär wegschreibe, wandern natürlich alle name-Einträge mit und blähen das Binärfile auf. Da muss ich doch die Namensliste separat im Code ablegen und Stück für Stück abarbeiten.
Ein paar Infos zum Hintergrund: settings sind die Daten, die mein NodeMCU beim Booten liest, die Einstellung erfolgt aber über eine HTML-Seite im LittleFS, die selbst zwar statisch ist, aber ein Javascript-File inkludiert, in dem die ganzen Einstellungen als document.formular.CVxx.value="..."; abgelegt werden. Ich will also immer beides schreiben, damit beim nächsten Aufruf der Konfigurationsseite die aktuellen settings voreingestellt sind, ich aber nicht immer das Javascript beim Starten neu parsen muss..
Das serialize()/deserialize() könnte man evtl. über JSON, CSV oder snprintf/sscanf basteln oder wenn man auf der gleichen Architektur bleibt auch binär das Array of struct/class speichern/einlesen.
Und letzteres mache ich. Die Javascriptversion dient dazu, die HTML-Konfigurationsseite statisch ausliefern und trotzdem die Werte einspielen zu können.
Danke, ich habe mir das (erstmal oberflächlich) angesehen: viele Wege führen nach Rom! Ich habe meine Variante ausprobiert, weil mir das häufige "String html = ... + ... +..." auf den Keks ging und ich so Daten, Funktion und Präsentation trennen können müsste. Ich kann das Ergebnis dann gerne mal hier oder nebenan vorstellen, wenn es wie gewünscht geklappt hat.