Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Istringstream到模板的管道_C++_Templates_Istringstream - Fatal编程技术网

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 what
PARAMTYPE