我有以下问题:我有一张从string
到string
的地图,名为psMap
。即psMap["a"]="20", psMap["b"]="test", psMap["c"]="12.5", psMap["d"]="1" (true)
因此映射存储各种基本数据类型的字符串表达式。
以下函数foo
应该(给定一个键),将映射的值复制到相应的类型变量,即;
int aa;
foo("a", aa);
=> aa=20.
显然,我希望为所有可能的数据类型设置一个函数(因此不需要手动转换),所以我尝试使用模板来利用istringsteram
的自动转换,即
template<class PARAMTYPE>
void foo(string _name, PARAMTYPE& _dataType) {
PARAMTYPE buff;
istringstream(psMap[_name]) >> buff;
_dataType = buff;
}
问题是,“&gt;&gt;”操作出错:Error: no match for »operator>>« in »std::basic_stringstream<char>((* ....
这里出了什么问题? stringstream
是否无法识别正确的数据类型并尝试输入抽象类型的“模板”?我怎么能让我的代码工作?
坦克你的努力:)
答案 0 :(得分:1)
您已创建了一个临时std::istream
,这意味着它
无法绑定到非const引用。一些>>
是
成员职能,他们会工作,但其他人是免费的
具有签名的函数:
std::istream& operator>>( std::istream&, TargetType& );
这些不起作用(甚至编译)。
要避免此问题,请先声明std::istringstream
并使用它,或调用临时的成员函数
什么都不做,但返回一个(非常量)引用:
std::istringstream( psMap[name] ).ignore(0) >> buff;
(就个人而言,我发现单独的变量更具可读性。)
答案 1 :(得分:0)
您使用reference作为模板参数,因此如果您调用
foo("a", aa);
没有&#39; &
它应该没问题(你需要尝试运算符的方式&gt;&gt;指针)。您还需要修改最后一个模板行:
_dataType = buff;
答案 2 :(得分:0)
尝试此实施:
template<class R>
R get_value(const std::string& name) {
R result{};
std::istringstream buffer{psMap[name]};
buffer >> result;
return result;
}
客户代码:
int x = get_value<int>("a");
此外,请勿使用以下划线开头的标识符。这是为图书馆实施者保留的。