Nicht die kürzeste, aber die coolste Möglichkeit ist, ein Array mit allen möglichen Werten von uint8_t
zu deklarieren und darüber zu iterieren.
#include <iostream>
#include <cstdint>
#include <limits>
namespace detail {
template<typename int_t, int_t cnt, bool not_done, int_t... rest>
struct range_impl {
static constexpr auto& value = range_impl<int_t, cnt - 1,
(cnt - 1) != std::numeric_limits<int_t>::min(), cnt, rest...>::value;
};
template<typename int_t, int_t cnt, int_t... rest>
struct range_impl<int_t, cnt, false, rest...> {
static constexpr int_t value[] = { cnt, rest... };
};
template<typename int_t, int_t cnt, int_t... rest>
constexpr int_t range_impl<int_t, cnt, false, rest...>::value[];
} // detail
template<typename int_t>
struct range : public detail::range_impl<int_t, std::numeric_limits<int_t>::max(), true> {};
int main(int argc, char** argv) {
for(uint8_t i: range<uint8_t>::value) {
std::cout << (int) i << std::endl;
}
for(int8_t i: range<int8_t>::value) {
std::cout << (int) i << std::endl;
}
}
Die Struktur range
generiert das Array in Kompilierzeit. Dieser Code kann für jeden Integer-Typ verwendet werden.
Ja. Entferne das ganze 'if'. Es ist überflüssig. –
'i = 0; do {....} while (++ i); ' –
Das Entfernen von if ändert dies in eine Endlosschleife. –