C++ 从Istringstream到模板的管道
我有以下问题:我有一个从C++ 从Istringstream到模板的管道,c++,templates,istringstream,C++,Templates,Istringstream,我有以下问题:我有一个从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. 明确地说,我希望所有可能的数据类型都有一个函数(因此没有手动转换),因此我尝试使用模板,利
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;
}
模板
void foo(字符串_名称、参数类型和数据类型){
浅黄色;
istringstream(psMap[_name])>>buff;
_数据类型=buff;
}
问题是“>>”操作给出了一个错误:error:与»std::basic_stringstream((*..…
这里出了什么问题?stringstream
是否无法识别正确的数据类型,并试图通过管道传输到抽象类型的“模板”中?如何使代码正常工作
感谢您的努力:)您使用引用作为模板参数,因此如果您调用
foo("a", aa);
如果不使用“&
,应该可以(需要使用您尝试的指针运算符>>的方式)。您还需要修改最后一行模板:
_dataType = buff;
尝试以下实现:
template<class R>
R get_value(const std::string& name) {
R result{};
std::istringstream buffer{psMap[name]};
buffer >> result;
return result;
}
模板
R get_值(常量标准::字符串和名称){
R结果{};
std::istringstream缓冲区{psMap[name]};
缓冲>>结果;
返回结果;
}
客户端代码:
int x = get_value<int>("a");
intx=get_值(“a”);
另外,不要使用以下划线开头的标识符。这是为库实现者保留的。您已经创建了一个临时的
std::istream
,这意味着
无法绑定到非常量引用。某些>
是
成员函数,它们将工作,但其他函数是免费的
具有签名的功能:
std::istream& operator>>( std::istream&, TargetType& );
而这些将无法工作(甚至无法编译)
要避免此问题,只需声明一个std::istringstream
并使用它,或调用临时
不执行任何操作,但返回(非常量)引用:
std::istringstream( psMap[name] ).ignore(0) >> buff;
(就我个人而言,我觉得单独的变量更具可读性。)将其解引用到
>*buf
和*\u dataType=*buff;
。您不想要istringstream而不是stringstream吗?buff
似乎没用,顺便说一句,直接使用dataType
。@parkydr:抱歉,更正了以下划线开头的itRe标识符:否。标识符以下划线开头,后跟小写字母a我们只在全局范围内保留。至少在理论上没有。在实践中,我也遇到过问题。(当然,出于可读性的原因,你永远不应该用下划线开始或结束变量。)我通常用下划线结束私有变量。我发现它们可读,到目前为止我没有问题(名称
,值
,片段
等)。这取决于字体,但对于很多字体,下划线会消失。一般来说,使用前导下划线或尾随下划线对读者来说是非常不友好的。我甚至没有考虑过下划线消失的问题。我会为我的个人编码约定想出一个替代方案:(…谢谢。我在初始化“R result{};”行时出错:result必须由构造函数初始化,而不是用“{…}”对这两个版本,我都会因为含糊不清的重载“for operator>”@Martin for whatPARAMTYPE
?