В целях интроспекции иногда я хотел автоматически назначать серийные номера типам или что-то подобное.
К сожалению, метапрограммирование шаблонов является, по сути, функциональным языком, и как таковой не хватает глобальных переменных или изменяемого состояния, которое могло бы реализовать такой счетчик.
Или это?
Пример кода по запросу:
#include <iostream>
int const a = counter_read;
counter_inc;
counter_inc;
counter_inc;
counter_inc;
counter_inc;
int const b = counter_read;
int main() {
    std::cout << a << ' ' << b << '\n'; // print "0 5"
    counter_inc_t();
    counter_inc_t();
    counter_inc_t();
    std::cout << counter_read << '\n'; // print "8"
    struct {
        counter_inc_t d1;
        char x[ counter_read ];
        counter_inc_t d2;
        char y[ counter_read ];
    } ls;
    std::cout << sizeof ls.x << ' ' << sizeof ls.y << '\n'; // print "9 10"
}
