从Istringstream管道到模板

时间:2014-01-31 13:35:55

标签: c++ templates istringstream

我有以下问题:我有一张从stringstring的地图,名为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是否无法识别正确的数据类型并尝试输入抽象类型的“模板”?我怎么能让我的代码工作?

坦克你的努力:)

3 个答案:

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

此外,请勿使用以下划线开头的标识符。这是为图书馆实施者保留的。