0

我有以下问题:我有一张地图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;
}

问题是,“>>”操作给出了错误:Error: no match for »operator>>« in »std::basic_stringstream<char>((* ....

这里出了什么问题?是否stringstream无法识别正确的数据类型并尝试通过管道输入“模板”的抽象类型?我怎样才能使我的代码工作?

为你的努力加油 :)

4

3 回答 3

1

您创建了一个临时的std::istream,这意味着它不能绑定到非常量引用。其中一些>>是成员函数,它们可以工作,但其他一些是带有签名的自由函数:

std::istream& operator>>( std::istream&, TargetType& );

这些将不起作用(甚至无法编译)。

为了避免这个问题,要么声明一个std::istringstream 并使用它,要么在临时对象上调用一个成员函数,它什么都不做,但返回一个(非常量)引用:

std::istringstream( psMap[name] ).ignore(0) >> buff;

(就个人而言,我发现单独的变量更具可读性。)

于 2014-01-31T13:56:51.133 回答
0

你使用引用作为模板参数,所以如果你调用

foo("a", aa);

没有 '&应该没问题(需要您尝试 operator>> 指针的方式)。您还需要修改最后一个模板行:

_dataType = buff;
于 2014-01-31T13:43:46.910 回答
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");

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

于 2014-01-31T13:48:10.007 回答