Я пишу некоторые классы шаблонов для анализа некоторых файлов текстовых данных, и поэтому большинство ошибок синтаксического анализа, вероятно, будет связано с ошибками в файле данных, которые по большей части не написаны программистами, и поэтому нужно хорошее сообщение о том, почему приложение не удалось загрузить, например, что-то вроде:
Ошибка разбора example.txt. Значение ("notaninteger") ключа [MySectiom] не является допустимым int
Я могу определить имена файлов, разделов и ключей по аргументам, передаваемым в функцию шаблона и переменные-члены в классе, однако я не уверен, как получить имя типа, который пытается преобразовать функция шаблона. к.
Мой текущий код выглядит так, со специализациями только для простых строк и таких:
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));
}
}
Скорее всего, не нужно создавать конкретные перегрузки для каждого типа, который могут использовать файлы данных, поскольку их много ...
Также мне нужно решение, которое не влечет за собой никаких накладных расходов во время выполнения, если только не происходит исключение, то есть то, что я хочу, - это решение с полной компиляцией, так как этот код называется тоннами раз, а время загрузки уже становится несколько большим.
РЕДАКТИРОВАТЬ: Хорошо, это решение, которое я придумал:
У меня есть types.h со следующим
#pragma once
template<typename T> const wchar_t *GetTypeName();
#define DEFINE_TYPE_NAME(type, name) \
template<>const wchar_t *GetTypeName<type>(){return name;}
Затем я могу использовать макрос DEFINE_TYPE_NAME для в файлах cpp для каждого типа, с которым мне нужно иметь дело (например, в файле cpp, который определил тип для начала).
Затем компоновщик может найти специализацию подходящего шаблона, если он где-то был определен, или выдать ошибку компоновщика, чтобы я мог добавить тип.