2012-03-30 8 views
7

내 머리말에있는 각 클래스의 고유 번호를 생성하려는 경우 (소수점 이하 자릿수), 단 1,2,3,4 등의 숫자 만 사용해야한다고 가정 해 보겠습니다.컴파일시에 고유 번호 생성

물론 나는이 하드 코드 수 : 이것은 현실 때문에 매우 오류가 발생하기 쉬운입니다

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

클래스가 작은되지 않습니다 내가 중간에 새로운 클래스를 추가하면 나는 모든 다음을 변경해야 ID 개요를 완전히 잃고 싶지 않은 경우 번호를 입력하십시오.

은 내가 다음을 수행 할 수 있으면 좋겠다 : constexpr 함수 호출 AFAIK 부작용이 없을 수 있기 때문에

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(); }; }; 

그러나, 이것은 불가능하다. 나는 그런 매크로를 사용하는 것도 불가능하다고 생각한다.

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; }; }; 

을하지만 솔직히, 나는 어떻게 구현하는 아무 생각이 :

나는 또한 그런 일에 행운이 될 것입니다.

내 목표를 달성 할 수 있습니까? 그렇다면 어떻게 할 수 있습니까?

+0

TMP와 어떤 관련이 있습니까? 그것이 당신이 탐험 해 왔던 길입니까? 아니면 TMP 마법사가 파란 색깔의 답을 찾을 수 있기를 희망하고 있습니까? – jpm

+0

네, 매크로로는이 작업을 수행 할 수 없기 때문에, TMP가 마지막 희망입니다. 그렇지 않으면 ID를 초기화하는 방법이 무엇입니까? 나는 다른 가능성에 대해서도 기뻐할 것이다. 좀 더 일반적인 게시물을 편집했습니다. – helami

+0

왜 이것을 원하니? –

답변

2

대부분 사람들은 __COUNTER__ 매크로를 사용하여이 작업을 수행합니다. 그러나 이것은 비표준이며, 전체 프로그램에 대해서만 존재합니다.

여기는 C++ hack입니다. 표준 호환이며 여러 카운터를 지원하는 템플릿과 오버로드를 사용했습니다.

+0

이것은 내가 선택한 해결책입니다. 내가 생각한 것을 명시 적으로 말하는 Thx. – helami

0

고유 번호가 필요할 때마다 자리 표시자를 하드 코딩 한 다음 파일을 사전 처리하는 작은 유틸리티를 작성하여 파일에서 마지막으로 사용한 번호를 유지하여 호출 전체에서 지속되도록 할 수 있습니다 .

4

나는 어쩌면 당신이 읽어야 그 부스트 전 처리기 라이브러리가 당신을 위해 할 수 있다고 생각 : How can I generate unique values in the C preprocessor?

당신이, GCC를 사용하고 MSVC가 ___COUNTER___ 매크로가 그 컴파일러에 따라 대안이 있다는 것을 일련 번호 허용 :