Und deswegen gibt es C++ und Meta-Programmierung:
1 | template <typename T>
|
2 | bool inc (T& var, T bottom, T top) {
|
3 | if (var < top) {
|
4 | var++;
|
5 | return false;
|
6 | } else {
|
7 | var = bottom;
|
8 | return true;
|
9 | }
|
10 | }
|
Aufzurufen z.B. so:
1 | uint8_t bla;
|
2 | if (inc (bla, 2, 27)) {
|
3 | }
|
oder:
1 | uint16_t bla;
|
2 | if (inc (bla, 2, 2217)) {
|
3 | }
|
Oder beliebigen anderen Integer-Typen. Im Endeffekt wird für jeden
angebenen Typ eine eigene Funktion speziell für diesen Typ erzeugt, die
dann auch entsprechend effizient ist.
Dies ist dann auch typsicher, d.h. so etwas wird vom Compiler
angemeckert:
1 | uint8_t bla;
|
2 | if (inc (bla, 2, 2217)) {
|
3 | }
|
und hat einen eigenen Scope und Typ, im Gegensatz zum Makro, und ist
deswegen vorzuziehen.