我正在编写一些用于解析某些文本数据文件的模板类,因此很可能大部分解析错误是由于数据文件中的错误而引起的,这些错误大部分不是程序员编写的,因此需要关于应用为何无法加载的好消息,例如:
解析example.txt时出错。[MySectiom]键的值(“ notaninteger”)不是有效的int
我可以从传递给模板函数的参数以及类中的成员vars得出文件名,节名和键名,但是我不确定如何获取模板函数尝试转换为的类型的名称。
我当前的代码看起来像,只对纯字符串等进行了专门化处理:
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));
}
}
宁可不必对数据文件可能使用的每种类型都进行特定的重载,因为它们有很多负载...
我还需要一个解决方案,除非出现异常,否则不会产生任何运行时开销,即我想要一个完全编译时的解决方案,因为此代码被称为“成千上万次”,并且加载时间已经有些长了。
编辑:好的,这是我想出的解决方案:
我有一个type.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文件中)。
只要链接器在某处定义,它就可以找到适当的模板专业化,否则抛出链接器错误,以便我可以添加类型。