我有一个类似std::map
的类,我从文本文件中读取变量和值,这段代码解析每一行,str
是文本文件中的一行,它看起来像这样VAR_NAME=value
,out
是值应该去的地方,它是模板变量。
[...]
std::stringstream ss;
ss<<str.substr(str.find("=")+1, str.length()-1);
T out;
ss>>out;
cmap[str.substr(0, str.find("="))] = out;
[...]
现在,使用此代码一切正常,但是当我将T
设置为std::string
时遇到问题,如果我有一条这样的行VAR_NAME=value spaced
,最后我得到了只有value
,spaced
在我使用>>
运算符时被切断了,我想知道如何通过尽可能保持代码干净来使其工作,我找到了getline ,但似乎对我不起作用......
答案 0 :(得分:1)
您可以使用辅助类及其专业化。
std::string
现在是template <> struct ValueExtractor<std::string>
{
static std::string get(std::string const& s)
{
return s;
}
};
的专业化。
T out = ValueExtractor<T>::get(str.substr(str.find("=")+1));
并将您的实施更改为:
pkg-config --modversion glib-2.0
答案 1 :(得分:0)
如果你想要做的是将key=val
字符串拆分为std::string key
和T
val,最简单的方法就是使用boost::lexical_cast
:
size_t eq = str.find('=');
std::string key = str.substr(0, eq);
T val = boost::lexical_cast<T>(str.substr(eq+1));