解析 example.txt 错误。[MySectiom]Key 的值 ("notaninteger") 不是有效的整数
我可以从模板函数和类的成员变量传递的参数中找出文件、节和键名,但我不知道如何获取模板函数试图转换为的类型的名称。
我的当前代码看起来像这样,只是针对普通字符串等进行了特化:
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;}
然后我可以在每个需要处理的类型的cpp文件中使用DEFINE_TYPE_NAME宏(例如,在定义要处理的类型的cpp文件中)。
只要模板特化已经被定义,链接器就能够找到正确的特化版本;如果没有定义,则会抛出链接器错误,以便我可以添加该类型。