Tôi đang viết một số lớp mẫu để phân tích cú pháp một số tệp dữ liệu văn bản và do đó, rất dễ xảy ra lỗi phân tích cú pháp sẽ do lỗi trong tệp dữ liệu, phần lớn không phải do lập trình viên viết, và vì vậy cần một thông báo hay về lý do tại sao ứng dụng không tải được, ví dụ như:
Lỗi phân tích cú pháp example.txt. Giá trị ("notaninteger") của [MySectiom] Key không phải là int hợp lệ
Tôi có thể tìm ra tệp, phần và tên khóa từ các đối số được truyền cho hàm mẫu và các vars thành viên trong lớp, tuy nhiên, tôi không chắc làm thế nào để lấy tên của loại mà hàm mẫu đang cố gắng chuyển đổi sang.
Mã hiện tại của tôi trông giống như thế, với các chuyên môn chỉ dành cho các chuỗi đơn giản và như vậy:
template<typename T> T GetValue(const std::wstring §ion, const std::wstring &key)
{
std::map<std::wstring, std::wstring>::iterator it = map[section].find(key);
if(it == map[section].end())
throw ItemDoesNotExist(file, section, key)
else
{
try{return boost::lexical_cast<T>(it->second);}
//needs to get the name from T somehow
catch(...)throw ParseError(file, section, key, it->second, TypeName(T));
}
}
Tôi thay vì phải tạo quá tải cụ thể cho mọi loại tệp dữ liệu có thể sử dụng, vì có rất nhiều chúng ...
Ngoài ra, tôi cần một giải pháp không phát sinh bất kỳ chi phí thời gian chạy nào trừ khi xảy ra ngoại lệ, tức là giải pháp thời gian biên dịch hoàn toàn là những gì tôi muốn vì mã này được gọi là tấn lần và thời gian tải đã hơi lâu.
CHỈNH SỬA: Ok, đây là giải pháp tôi đã đưa ra:
Tôi có một loại. H tiếp tục như sau
#pragma once
template<typename T> const wchar_t *GetTypeName();
#define DEFINE_TYPE_NAME(type, name) \
template<>const wchar_t *GetTypeName<type>(){return name;}
Sau đó, tôi có thể sử dụng macro DEFINE_TYPE_NAME trong các tệp cpp cho từng loại tôi cần xử lý (ví dụ: trong tệp cpp đã xác định loại để bắt đầu).
Sau đó, trình liên kết có thể tìm thấy chuyên môn hóa mẫu phù hợp miễn là nó được xác định ở đâu đó hoặc nếu không thì trình liên kết sẽ gặp lỗi để tôi có thể thêm loại.