我正在编写一些解析文本数据文件的模板类,因此很可能大多数解析错误都是由数据文件中的错误引起的,这些错误大部分不是由程序员编写的,所以需要一个关于应用程序为什么加载失败的好消息,例如:
解析[ MySectiom ] Key 的 example.txt. Value (“ notanwhole”)时出错,不是有效的 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));
}
}
Id 不必为数据文件可能使用的每种类型都进行特定的重载,因为它们有很多重载..。
此外,我需要一个解决方案,除非发生异常,否则不会产生任何运行时开销,也就是说,我想要的是一个完整的编译时解决方案,因为这段代码被调用了无数次,而且加载时间已经有点长了。
编辑: 好的,这是我想到的解决方案:
我有一个类型.h 包含以下内容
#pragma once
template<typename T> const wchar_t *GetTypeName();
#define DEFINE_TYPE_NAME(type, name) \
template<>const wchar_t *GetTypeName<type>(){return name;}
然后,我可以在 cpp 文件中使用 DEFINE _ TYPE _ NAME 宏来处理我需要处理的每个类型(例如,在定义开始处理的类型的 cpp 文件中)。
然后,链接器能够找到适当的模板专门化,只要它是在某处定义的,否则抛出链接器错误,以便我可以添加类型。