Có cách nào để chỉ định hàm tạo mặc định của enum class
không?Người dùng xác định C++ 11 enum class Mặc định Constructor
Tôi đang sử dụng enum class
để chỉ định một tập hợp các giá trị được phép cho một kiểu dữ liệu cụ thể trong thư viện: trong trường hợp này, đó là số id pin GPIO của Raspberry Pi. Nó trông giống như sau:
enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }
Điểm của tôi làm điều này thay vì chỉ sử dụng, chẳng hạn, một int
là để đảm bảo mã đó là an toàn: Tôi static_assert
(hoặc nếu không có thể biên dịch thời gian đảm bảo - phương pháp thực tế được sử dụng không quan trọng đối với tôi) những thứ như ai đó đã không mắc lỗi chính tả (chuyển số 5 thay vì số 4, v.v.) và tôi nhận được thông báo lỗi tự động cho các loại không khớp, v.v.
vấn đề sau đó là enum class
có một hàm tạo mặc định - vì lợi ích của khả năng tương thích với C của enum
tôi giả định (vì chúng có thứ hành vi tương tự) - khởi tạo số enum class
tương đương 0
. Trong trường hợp này, không có giá trị 0
. Điều này có nghĩa rằng người dùng thực hiện một tuyên bố/định nghĩa như:
PinID pid = PinID();
là nhận được một Enumerator mà không được định nghĩa một cách rõ ràng (và thậm chí không có vẻ "tồn tại" khi người ta nhìn vào mã), và có thể dẫn đến lỗi thời gian chạy. Điều này cũng có nghĩa là các kỹ thuật như số switch
ing trên các giá trị của các điều tra được xác định rõ ràng là không thể mà không có lỗi/trường hợp mặc định - cái gì tôi muốn tránh, vì nó buộc tôi hoặc throw
hoặc thực hiện một cái gì đó như trả lại boost::optional
. amenable để phân tích tĩnh.
Tôi đã cố gắng xác định hàm tạo mặc định không có kết quả. Tôi (tuyệt vọng) đã cố gắng để xác định một chức năng mà chia sẻ tên của enum class
, nhưng điều này (khá đáng ngạc nhiên) dẫn đến lỗi trình biên dịch lạ. Tôi muốn giữ lại khả năng đúc enum class
thành int
, với tất cả các bản đồ liệt kê N#
liệt kê thành #
tương ứng của chúng, do đó, chỉ đơn thuần là "xác định", giả sử, N4 = 0 là không thể chấp nhận; điều này là vì sự đơn giản và lành mạnh.
Tôi đoán câu hỏi của mình là hai lần: có cách nào để có được loại an toàn tĩnh sau khi sử dụng enum class
không? Nếu không, những khả năng nào khác sẽ thích? Những gì tôi muốn là cái gì đó:
- là mặc định constructable
- có thể được thực hiện để mặc định xây dựng một giá trị hợp lệ tùy ý
- cung cấp "tập hữu hạn các quy định" giá trị tạo nên bởi
enum class
es - là ít nhất là an toàn như kiểu một
enum class
- (tốt nhất) không liên quan đến đa hình runtime
Lý do tôi muốn xây dựng mặc định là vì tôi dự định sử dụng boost::lexical_cast
để giảm chi phí liên quan đến chuyển đổi giữa các giá trị enum class
và thực tế liên quan đến string
s mà tôi đã xuất sang hệ điều hành (sysfs trong trường hợp này); boost::lexical_cast
yêu cầu khả năng xây dựng mặc định.
Lỗi trong lý do của tôi được hoan nghênh - tôi bắt đầu nghi ngờ rằng enum class
es là đối tượng phù hợp cho công việc sai, trong trường hợp này; làm rõ sẽ được cung cấp nếu được hỏi. Cảm ơn bạn đã dành thời gian.
Chỉ cần nhìn vào đó, có vẻ tốt, nhưng nó có hoạt động không? Bạn có một định nghĩa lớp bao gồm một thể hiện của chính nó như là một thành viên ... oh nhưng chúng là tĩnh. Trình biên dịch không phát điên sau đó. Gấu thông minh. – FizzixNerd
@ FizzixNerd Tôi đã không chạy nó mặc dù một trình biên dịch nhưng nó sẽ làm việc ... Tôi nghĩ rằng nếu bạn thêm các nhà khai thác dòng bạn sẽ có thể sử dụng nó trực tiếp với lexical_cast, tôi giả sử ném một ngoại lệ nếu một giá trị không hợp lệ đến. – PeterSW
@PeterSW, bạn có thể chỉ ra, mục nào trong C++ 11 standart để bạn tham khảo, nói về zero-initialization? –