2013-07-24 68 views
5

Tôi có một enum như thế này: (Trên thực tế, nó là một lớp enum)typedef và enum hoặc enum lớp

enum class truth_enum { 
    my_true = 1, 
    my_false = 0 
}; 

Tôi muốn để có thể tiếp xúc với my_true đến không gian tên toàn cầu, vì vậy mà tôi có thể làm này:

char a_flag = my_true; 

Hoặc ít nhất:

char a_flag = (char)my_true; 

Thay vì điều này:

char a_flag = truth_enum::my_true; 

Điều này có khả thi không?

Tôi đã thử một cái gì đó như thế này:

typedef truth_enum::my_true _true_; 

tôi nhận được lỗi: my_true trong lớp enum truth_enum không tên một loại

đoán của tôi là my_true là một giá trị không phải là một kiểu. Có cách nào khác mà tôi có thể thực hiện để kích hoạt chức năng này trong các chương trình của tôi không?

Không lý tưởng, nhưng tôi có thể làm một cái gì đó như:

enum class : const char { ... }; 
const char const_flag_false = truth_enum::my_false; 

Hmm ...

+0

nếu bạn sử dụng lớp enum, bạn không thể tránh viết tiền tố. verbosity không phải là một vấn đề, trừ khi nó cản trở khả năng đọc. – yngccc

+0

Một điều tra viên của một lớp 'enum' không ngầm chuyển thành một số nguyên, vì vậy' char a_flag = my_true; 'là sai. –

+0

Tôi đã sử dụng một chuyển đổi ở trên – user3728501

Trả lời

1

Di class từ định nghĩa enum. Tôi sẽ giả định rằng bạn bị xúc phạm bởi chuyển đổi ẩn thành int. Làm thế nào về:

static constexpr truth_enum _true_ = truth_enum::my_true; 
static constexpr truth_enum _false_ = truth_enum::my_false; 

hoặc đơn giản là

const truth_enum _true_ = truth_enum::my_true; 
const truth_enum _false_ = truth_enum::my_false; 
+0

Được rồi, tôi sẽ xem xét trong một giây này tôi cần phải sửa mã của mình trong khi tôi nhớ – user3728501

+0

static contexpr làm gì? Trên thực tế, contexpr làm gì? – user3728501

+0

'constepxr'applied vào một biến làm cho nó' const' và buộc trình biên dịch để tính toán initializer của nó tại thời gian biên dịch. Trong trường hợp cụ thể này, về cơ bản nó giống hệt 'const' - tôi có lẽ đã lạm dụng cấu trúc mới hào nhoáng ở những nơi nó hoạt động nhưng không thực sự cần thiết. – Casey

0

Giải pháp là dễ dàng, những sai lầm tôi làm là sử dụng enum class thay vì enum.

Yeah, vì vậy vẫn còn một chút bối rối thực sự - Tôi bây giờ có thể chỉ cần sử dụng các giá trị như:

bool aboolean = (bool)my_true; 

Thay vì phải làm điều này:

bool aboolean = (bool)truth_enum::my_true; 

Tại sao điều này? (Tạo một cộng đồng wiki, để mọi người có thể chỉnh sửa ...)

+0

Enums trong C + + kế thừa từ C, nơi nó khá nhiều chỉ là một macro tiền xử lý. Vì vậy, nó có thể nhìn thấy trong không gian tên chung. –