如何强制 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 类型或从 T 类型自动转换。字符串只是模板的一种实例,它还必须支持其他类型。这就是为什么我想强制运算符 >> 模仿 std::getline 的行为。

有帮助吗?

解决方案

与操作员>>未满足时T =串,我们可以写为[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::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; 
} 

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

如果你要它停止?如果你想读一整行,你可能需要函数getline 的功能,如果您需要存储在streamstring整个字符串对象您的choise是 ostringstream ::海峡方法。

我假设你正在使用实例是T = std::string模板。在这种情况下,你可以使用函数getline:

getline(ss, m_value, '\0');

然而,这是假定你不会接受NUL字符作为字符串的有效部分。

否则,你可以写你自己提取的'T”。

有没有与运营商的方式>>据我所知除外编写自己小的(运营商>>停在第一个字符使isspace(C,getloc())为真)。但在<字符串>其中有你想要的行为getline函数的。

如果你可以使用 促进 然后使用 升压::词法转换.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top