C++ 如何强制std::stringstream操作符>&燃气轮机;要读取整个字符串?

C++ 如何强制std::stringstream操作符>&燃气轮机;要读取整个字符串?,c++,stl,stringstream,stdstring,C++,Stl,Stringstream,Stdstring,如何强制std::stringstream操作符>>读取整个字符串,而不是在第一个空格处停止 我有一个模板类,它存储从文本文件读取的值: template <typename T> class ValueContainer { protected: T m_value; public: /* ... */ virtual void fromString(std::string & str) { std::stringstream ss; ss

如何强制std::stringstream操作符>>读取整个字符串,而不是在第一个空格处停止

我有一个模板类,它存储从文本文件读取的值:

template <typename T>
class ValueContainer
{
protected:
  T m_value;

public:
  /* ... */
  virtual void fromString(std::string & str)
  {
    std::stringstream ss;
    ss << str;
    ss >> m_value;
  }
  /* ... */
};
模板
类值容器
{
受保护的:
T m_值;
公众:
/* ... */
虚拟void fromString(std::string和str)
{
std::stringstream-ss;
ss>m_值;
}
/* ... */
};
我尝试设置/取消设置流标志,但没有帮助

澄清


该类是一个容器模板,可以自动转换为类型T或从类型T转换为类型T。字符串只是模板的一个实例,它还必须支持其他类型。这就是为什么我想强制操作符>>模仿std::getline的行为。

除了编写自己的方面之外,我不知道操作符>>还有什么方法(操作符>>在isspace(c,getloc())为true的第一个字符处停止)。但是有一个getline函数,它具有您想要的行为。

您希望它在哪里停止?如果您想读取整行,您可能需要函数,如果您需要存储在streamstring对象中的整个字符串,那么您选择的是方法。

我假设您正在使用
T=std::string
实例化该模板。在这种情况下,您可以使用getline:

getline(ss, m_value, '\0');
但是,这假设您不接受nul字符作为字符串的有效部分

否则,您可以为'T'编写自己的提取器。

这里有一个解决方案:

std::istream & ReadIntoString (std::istream & istr, std::string & str) 
{ 
    std::istreambuf_iterator<char> it(istr), end; 
    std::copy(it, end, std::inserter(str, str.begin())); 
    return istr; 
} 
std::istream&ReadIntoString(std::istream&istr,std::string&str)
{ 
std::istreambuf_迭代器it(istr),结束;
std::copy(it,end,std::inserter(str,str.begin());
返回istr;
} 

(由于C++新闻组中的原始海报)

AS > > > T>String,我们不能为[t=字符串]写一个特定的函数。这可能不是正确的解决方案。但是,正如工作环境所提到的

如果不能满足你的要求,请纠正我

我编写了一个示例代码,如下所示:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

template <class T>
class Data
{
    T m_value;
    public:
    void set(const T& val);
    T& get();
};

template <class T>
void Data<T>::set(const T& val)
{
    stringstream ss;
    ss << val;
    ss >> m_value;
}

void Data<string>::set(const string& val)
{
    m_value = val;
}

template <class T>
T& Data<T>::get()
{
    return m_value;
}

int main()
{
    Data<int> d;
    d.set(10);
    cout << d.get() << endl;

    Data<float> f;
    f.set(10.33);
    cout << f.get() << endl;

    Data<string> s;
    s.set(string("This is problem"));
    cout << s.get() << endl;
}
#包括
#包括
#包括
使用名称空间std;
模板
类数据
{
T m_值;
公众:
无效集(常数T&val);
T&get();
};
模板
无效数据::集合(常量T&val)
{
细流ss;
ss>m_值;
}
void Data::set(常量字符串和val)
{
m_值=val;
}
模板
T&Data::get()
{
返回m_值;
}
int main()
{
数据d;
d、 组(10);

cout如果可以使用,那么就使用。

我知道,但我也需要将字符串转换为其他值,我不想为字符串创建单独的容器。正如我所说的,使用getline的替代方法是编写一个方面。我知道我会使用什么。请注意,使用traits只允许对fromSt的行为进行特殊处理环,而不是整个容器。我认为ostringstream::str()是这里最好的解决方案。我不清楚问题出在哪里。如果你想
>
使用类
T
,你需要覆盖
>
,就像
stringstream&operator>>(T&receiver)
。在该功能中,您可以访问
stringstream
(通过
this
)和
receiver
,您可以从
*this
中提取所需的任意数量的数据。您能更清楚地解释问题吗?对不起,这是
stringstream&operator>(stringstream&ss,T&receiver)
,当然,你可以直接访问
ss
。实际上,我已经用专门的字符串模板解决了这个问题。谢谢你的回答!如果原始帖子在某个地方在线,请添加链接!