C++ Получить имя типа в шаблонеC++

Программы на C++. Форум разработчиков
Anonymous
 C++ Получить имя типа в шаблоне

Сообщение Anonymous »

Я пишу несколько классов шаблонов для анализа некоторых файлов текстовых данных, и поэтому вполне вероятно, что подавляющее большинство ошибок анализа будет связано с ошибками в файле данных, которые по большей части написаны не программистами. и поэтому нужно хорошее сообщение о том, почему приложение не удалось загрузить, например. что-то вроде:


Ошибка анализа файла example.txt. Значение ("notaninteger") [MySectiom]Key не является допустимым целым числом.


Я могу определить имена файлов, разделов и ключей. из аргументов, переданных функции шаблона, и переменных-членов в классе, однако я не уверен, как получить имя типа, в который пытается преобразовать функция шаблона.

Мой текущий код со специализацией только для простых строк и тому подобного выглядит так:

Код: Выделить всё

template T GetValue(const std::wstring &section, const std::wstring &key)
{
std::map::iterator it = map[section].find(key);
if(it == map[section].end())
throw ItemDoesNotExist(file, section, key)
else
{
try{return boost::lexical_cast(it->second);}
//needs to get the name from T somehow
catch(...)throw ParseError(file, section, key, it->second, TypeName(T));
}
}
Мне бы не хотелось создавать отдельные перегрузки для каждого типа, который могут использовать файлы данных, поскольку их очень много...

Кроме того, мне нужно решение, которое не влечет за собой каких-либо накладных расходов во время выполнения, если не возникает исключение, то есть решение, полностью требующее времени компиляции, — это то, что мне нужно, поскольку этот код вызывается много раз, а время загрузки уже становится несколько долгим. .

РЕДАКТИРОВАТЬ: Хорошо, это решение, которое я придумал:

У меня есть type.h, содержащий подписка

Код: Выделить всё

#pragma once
template const wchar_t *GetTypeName();

#define DEFINE_TYPE_NAME(type, name) \
templateconst wchar_t *GetTypeName(){return name;}
Затем я могу использовать макрос DEFINE_TYPE_NAME для добавления файлов cpp для каждого типа, с которым мне нужно иметь дело (например, в файле cpp, который определил тип для начала).< /p>

Тогда компоновщик сможет найти подходящую специализацию шаблона, если она где-то определена, или в противном случае выдать ошибку компоновщика, чтобы я мог добавить тип.

Тогда компоновщик сможет найти подходящую специализацию шаблона, если она где-то определена, или в противном случае выдать ошибку компоновщика, чтобы я мог добавить тип.

Тогда компоновщик сможет найти подходящую специализацию шаблона, если она где-то определена.>

Подробнее здесь: https://stackoverflow.com/questions/105 ... n-template

Вернуться в «C++»