Ich habe da mal ein C++-Problem... Code zur Frage:
#include <Arduino.h>
// Template-Klasse zur Wertspeicherung
template<typename T, T minval, T maxval> class Varz {
protected:
T value;
T min;
T max;
std::function<void(unsigned char, T, T)> callback;
public:
Varz() : value(0), min(minval), max(maxval), callback(nullptr) {
static_assert(std::is_integral<T>::value, "Varz is for integral types only!");
}
operator T() { return value; }
T operator=(T v) {
if (v < min) v = min;
if (v > max) v = max;
if (v != value) {
if (callback) callback('A', value, v);
value = v;
}
return v;
}
void setCallback(std::function<void(unsigned char, T, T)> cb) { callback = cb; }
};
// Klasse als Benutzer der Templateklasse
struct UseZ {
Varz<uint16_t, 10, 1200> wert;
const char *name;
UseZ(const char *n) : name(n) {};
};
// Callback-Funktion
void varzCB(unsigned char b, uint32_t oldV, uint32_t newV) {
Serial.printf("Varz '%c': %d->%d\n", b, oldV, newV);
}
void setup() {
// Serial setup
Serial.begin(115200, SERIAL_8N1);
Serial.println("");
// Eigenständige Instanz der Template-Klasse
Varz<uint32_t, 10, 254> varz;
varz.setCallback(varzCB);
uint32_t preV = 116;
varz = preV;
uint32_t postV = varz;
Serial.printf("preV=%d, varz=%d, postV=%d\n", preV, (uint32_t)varz, postV);
// Zwei Nutzerinstanzen
UseZ A("Erster");
UseZ B("Zweiter");
A.wert.setCallback(varzCB);
B.wert.setCallback(varzCB);
A.wert = varz;
B.wert = 5000;
}
void loop() {
}
Das liefert als Ausgabe
Varz 'A': 0->116
preV=116, varz=116, postV=116
Varz 'A': 0->116
Varz 'A': 0->1200
So weit, so gut.
Unschön: die Callback-Funktion varzCB()
wird auch für die beiden Memberinstanzen A.wert
und B.wert
akzeptiert, obwohl die Signatur anders ist (uint32_t
-Argumente, wo wert
uint16_t
benutzt). Nun ja.
Meine Frage dazu ist: Wie kann ich die beiden wert
-Memberinstanzen dazu bringen, zu wissen, in welcher Nutzerinstanz sie sich befinden? Also zum Beispiel den name
der Nutzerinstanz an die Callbackfunktion zu übergeben?