2012-03-30 12 views
7

Chcę generować unikalne liczby dla każdej klasy w moim nagłówku, liczby pierwsze w moim przypadku liczb pierwszych ale powiedzmy, że powinny to być tylko kolejne liczby tj. 1,2,3,4 itd.Generowanie unikalnych liczb podczas kompilacji

Oczywiście mogę zakodować te:

struct A { enum { ID = 1; }; }; 
struct B { enum { ID = 2; }; }; 
struct C { enum { ID = 3; }; }; 
struct D { enum { ID = 4; }; }; 

To jest bardzo podatne na błędy, ponieważ w rzeczywistości zajęcia nie są tak małe, a jeśli dodać nową klasę w środku muszę zmienić wszystkie następujące numery, jeśli nie chcę całkowicie stracić przeglądu identyfikatorów.

Chciałabym wykonać następujące czynności:

struct A { enum { ID = get_next_int(); }; }; 
struct B { enum { ID = get_next_int(); }; }; 
struct C { enum { ID = get_next_int(); }; }; 
struct D { enum { ID = get_next_int(); }; }; 

Ale ponieważ wywołuje funkcje constexpr nie może mieć skutki uboczne AFAIK, jest to niemożliwe. Myślę, że używanie makr taki wynik też jest niemożliwe.

Byłbym również szczęście z czymś takim:

struct A_id_holder : some_base_counter {}; 
struct A { enum { ID = A_id_holder::ID; }; }; 

struct B_id_holder : some_base_counter {}; 
struct B { enum { ID = B_id_holder::ID; }; }; 

struct C_id_holder : some_base_counter {}; 
struct C { enum { ID = C_id_holder::ID; }; }; 

struct D_id_holder : some_base_counter {}; 
struct D { enum { ID = D_id_holder::ID; }; }; 

Ale szczerze mówiąc, nie mam pojęcia, jak zaimplementować to.

Czy mogę osiągnąć mój cel, a jeśli tak, to w jaki sposób?

+0

Co to ma wspólnego z TMP? Czy to jest sposób, który zbadałeś, czy też masz nadzieję, że kreator TMP przyjdzie z odpowiedzią z nieba? – jpm

+0

Tak, ponieważ nie można tego zrobić za pomocą makr, TMP jest moją ostatnią nadzieją (lub jak zainicjować identyfikator inaczej?). Byłbym też zadowolony z innych możliwości. Zmieniłem mój post, by był bardziej ogólny. – helami

+0

Dlaczego tego chcesz? –

Odpowiedz

2

Większość ludzi robi to z makro __COUNTER__. Ale to jest niestandardowe i jest tylko jeden na cały program.

Oto C++ hack Wymyśliłem użycie szablonów i przeciążenie, które jest zgodne ze standardami i obsługuje wiele liczników.

+0

To jest rozwiązanie, które wybrałem. Thx za wyraźne powiedzenie tego, co myślałem. – helami

0

Jednym ze sposobów może być zakodowanie symbolu zastępczego, gdziekolwiek chcesz, unikalnego numeru, a następnie napisanie małego narzędzia do wstępnego przetworzenia plików, być może zachowanie ostatnio używanego numeru w pliku, aby pozostało w inwokacjach .