2012-03-30 43 views
7

Tôi muốn tạo số duy nhất cho mỗi lớp trong tiêu đề, số nguyên tố trong số nguyên tố của trường hợp, nhưng giả sử đây chỉ là các số liên tiếp tức là 1,2,3,4, v.v.Tạo số duy nhất tại thời gian biên dịch

Dĩ nhiên tôi có thể hardcode này:

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

này rất dễ bị lỗi vì trong thực tế các lớp học không phải là nhỏ và nếu tôi thêm một lớp mới ở giữa tôi phải thay đổi tất cả những điều sau đây nếu tôi không muốn hoàn toàn mất tổng quan về ID.

Tôi ước gì có thể làm như sau:

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

Nhưng vì chức năng constexpr cuộc gọi không thể có tác dụng phụ afaik, điều này là không thể. Tôi nghĩ rằng bằng cách sử dụng các macro như một kết quả là không thể quá.

Tôi cũng sẽ may mắn với một cái gì đó như thế:

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

Nhưng thành thật, tôi không có ý tưởng làm thế nào để thực hiện điều đó.

Tôi có thể đạt được mục tiêu của mình và nếu có, làm cách nào?

+0

Điều này có liên quan gì với TMP? Đó có phải là một đại lộ mà bạn đã khám phá, hoặc bạn chỉ hy vọng một TMP wizard sẽ đi cùng với một câu trả lời ra khỏi màu xanh? – jpm

+0

Có, vì điều này không thể được thực hiện với các macro, TMP là hy vọng cuối cùng của tôi (hoặc cách khởi tạo ID khác?). Tôi cũng sẽ vui mừng về những khả năng khác. Tôi đã chỉnh sửa bài đăng của mình để tổng quát hơn. – helami

+0

Tại sao bạn muốn điều này? –

Trả lời

2

Hầu hết mọi người làm điều này với macro __COUNTER__. Nhưng đó là không chuẩn, và chỉ có một cho toàn bộ chương trình.

Dưới đây là C++ hack Tôi đã đưa ra các mẫu và quá tải phù hợp tiêu chuẩn và hỗ trợ nhiều bộ đếm.

+0

Đây là giải pháp tôi đã chọn. Thx cho một cách rõ ràng nói những gì tôi nghĩ. – helami

0

Một cách có thể là mã cứng một trình giữ chỗ bất cứ nơi nào bạn muốn một số duy nhất và sau đó viết một tiện ích nhỏ để xử lý trước các tệp, có thể giữ số được sử dụng cuối cùng trong tệp để nó vẫn tồn tại trên các lời gọi .

Các vấn đề liên quan