Tôi có thể đang cố gắng đạt được điều không thể, nhưng StackExchange luôn làm tôi ngạc nhiên, vì vậy hãy đi theo hướng này:Bản đồ có thể được kiểm tra theo thời gian biên dịch có thể không?
Tôi cần ánh xạ tên thành số nguyên. Tên (khoảng 2k) là duy nhất. Sẽ không có thêm hoặc xóa bỏ danh sách đó và các giá trị sẽ không thay đổi trong thời gian chạy.
Triển khai chúng dưới dạng const int
biến cho phép tôi kiểm tra thời gian biên dịch cho sự tồn tại và loại. Ngoài ra điều này rất rõ ràng và tiết trong mã. Lỗi dễ bị phát hiện.
Triển khai chúng dưới dạng std::map<std::string, int>
mang lại cho tôi nhiều tính linh hoạt để xây dựng tên để tìm kiếm bằng thao tác chuỗi. Tôi có thể sử dụng điều này để cung cấp cho các chuỗi như các tham số cho các hàm có thể truy vấn danh sách cho nhiều giá trị bằng cách chắp thêm tiền tố/hậu tố vào chuỗi đó. Tôi cũng có thể lặp qua nhiều giá trị bằng cách tạo một phần số của tên khóa từ biến vòng lặp.
Bây giờ câu hỏi của tôi là: có phương pháp kết hợp cả hai lợi thế không? Việc thiếu kiểm tra thời gian biên dịch (đặc biệt là đối với khóa-tồn tại) gần như giết chết phương pháp thứ hai cho tôi. (Đặc biệt là std::map
âm thầm trả về 0
nếu khóa không tồn tại gây khó tìm lỗi.) Nhưng khả năng lặp và tiền tố/hậu tố bổ sung rất hữu ích.
Tôi thích một giải pháp không sử dụng bất kỳ thư viện bổ sung nào như tăng cường, nhưng vui lòng đề xuất chúng dù sao tôi vẫn có thể triển khai lại chúng.
Một ví dụ về những gì tôi làm với bản đồ:
void init(std::map<std::string, int> &labels)
{
labels.insert(std::make_pair("Bob1" , 45));
labels.insert(std::make_pair("Bob2" , 8758));
labels.insert(std::make_pair("Bob3" , 436));
labels.insert(std::make_pair("Alice_first" , 9224));
labels.insert(std::make_pair("Alice_last" , 3510));
}
int main()
{
std::map<std::string, int> labels;
init(labels);
for (int i=1; i<=3; i++)
{
std::stringstream key;
key << "Bob" << i;
doSomething(labels[key.str()]);
}
checkName("Alice");
}
void checkName(std::string name)
{
std::stringstream key1,key2;
key1 << name << "_first";
key2 << name << "_last";
doFirstToLast(labels[key1.str()], labels[key2.str()]);
}
mục tiêu khác là mã hiển thị trong main()
ở lại thói quen dễ dàng và tiết càng tốt. (Cần phải được hiểu bởi những người không lập trình.) Hàm init()
sẽ được tạo mã bởi một số công cụ. Các hàm doSomething(int)
được cố định, nhưng tôi có thể viết các hàm bao quanh chúng. Những người trợ giúp như checkName()
có thể phức tạp hơn, nhưng cần phải dễ dàng gỡ lỗi.
Có vẻ như bạn muốn xây dựng các dây lúc chạy, nhưng bằng cách nào đó đã này kiểm tra tại thời gian biên dịch? –
Có nhiều cách để chuyển đổi enums thành các chuỗi thích hợp của chúng, vì vậy nó sẽ có thể .. Mặc dù khó có thể xem được thời gian biên dịch như thế nào nếu bạn xây dựng các chuỗi trong thời gian chạy –
'std :: map' chắc chắn có khả năng cho dù một phần tử đã được chèn vào chưa. Một cách là 'chèn'. – chris