2012-07-12 38 views
129

thể trùng lặp:
Generic way to cast int to enum in C++Làm thế nào để đúc int để enum trong C + +?

Làm thế nào để đúc một int để một enum trong C++?

Ví dụ:

enum Test 
{ 
    A, B 
}; 

int a = 1; 

Làm thế nào để chuyển đổi a gõ Test :: A?

+84

Tôi thích thực tế rằng đây có điểm tiêu cực, đánh dấu là nhân đôi nhưng là kết quả đầu khi thực hiện một tìm kiếm google cho "C++ int to enum" – Rickard

+1

[link] (http://www.enel.ucalgary.ca/People/Norman/enel315_winter1997/enum_types/) Lưu ý rằng nó không quan trọng liệu int có khớp với một trong các hằng số của kiểu enum hay không; loại chuyển đổi luôn là bất hợp pháp. – Iwaz

+6

Nếu đây là bản dup, thì tại sao các câu trả lời lại khác nhau? – nobar

Trả lời

152
int i = 1; 
Test val = static_cast<Test>(i); 
+11

auto val = static_cast (i); // C++ 11 – Mitch

+1

@Chuyển những gì tôi nhận được khi sử dụng 'tự động' trong trường hợp này? Có bất kỳ cải tiến hiệu suất nào không? –

+1

Không có cải thiện hiệu suất. Chỉ cải tiến bảo trì. – Mitch

50
Test e = static_cast<Test>(1); 
+0

MSDN: Không có kiểm tra kiểu thời gian chạy được thực hiện để giúp đảm bảo sự an toàn của việc chuyển đổi (http://msdn.microsoft.com/en-us/library/c36yw7x9(v=vs.80).aspx). –

+6

MSDN: Toán tử static_cast có thể chuyển đổi một cách rõ ràng giá trị tích phân thành kiểu liệt kê. Nếu giá trị của loại tích phân không nằm trong phạm vi của các giá trị đếm, thì giá trị điều tra kết quả là không xác định. –

+1

@KirillKobelev nếu giá trị tích phân có thể được biểu diễn bằng kiểu cơ bản của enum thì enum kết quả phải có giá trị đó. Nếu không, giá trị enum được tạo ra sẽ là bất kỳ kết quả giá trị nào từ việc chuyển đổi biểu thức sang kiểu cơ bản của enum. Nếu VC++ làm một cái gì đó khác nhau thì tôi nghĩ nó không phù hợp. – bames53

13

Mã của bạn

enum Test 
{ 
    A, B 
} 

int a = 1; 

Giải pháp

Test castEnum = (Test)a; 
+34

Bạn nên sử dụng diễn viên hạn chế nhất có thể, và tránh hoàn toàn phôi kiểu C, để cho trình biên dịch đó là cơ hội tốt nhất để phát hiện lỗi.'static_cast' sẽ là một diễn viên tốt hơn ở đây. –

+3

@Mike Seymour, vấn đề là tĩnh đúc không có sự khác biệt từ C-cast trong trường hợp này. Làm thế nào và những gì sai lầm nó có thể phát hiện? –

+7

@KirillKobelev: Vấn đề là dàn diễn viên kiểu C không rõ ràng. Nó có thể bằng một 'static_cast', nhưng nó cũng có thể là' const_cast' hoặc thậm chí tệ hơn, một 'reinterpret_cast' hoặc thậm chí là sự kết hợp của chúng. Ngay cả khi bạn biết bây giờ trong những gì nó sẽ làm suy giảm, giả sử bạn thay đổi 'a' sang kiểu khác sau này, nó có thể rất tốt là kiểu thay đổi đúc mà không bao giờ bạn nhận được nhiều như cảnh báo, bạn không muốn điều đó. – KillianDS

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