从stringstream到模板变量的Getline

时间:2015-04-28 16:45:00

标签: c++

我有一个类似std::map的类,我从文本文件中读取变量和值,这段代码解析每一行,str是文本文件中的一行,它看起来像这样VAR_NAME=valueout是值应该去的地方,它是模板变量。

[...]
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,最后我得到了只有valuespaced在我使用>>运算符时被切断了,我想知道如何通过尽可能保持代码干净来使其工作,我找到了getline ,但似乎对我不起作用......

2 个答案:

答案 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 keyT 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));