繁体   English   中英

从带有空格的std :: stringstream中提取流

[英]Stream extracting from std::stringstream with spaces

我有这个模板函数,它以字符串的形式从std::map获取元素,然后通过std::stringstream operator>>将其转换为通用T并返回它。

但是,提取运算符仅提取流中的第一个单词。

我已经尝试过.str() ,但是对于模板功能却无法做到。 我也尝试过ss >> std::noskipws >> result; 但它似乎未返回有效数据。

template<typename T>
T CConfig::get(const char *setting)
{
    std::stringstream ss;
    ss << this->m_settings[setting];
    // this->m_settings[setting] = "this is a test"

    T result;
    ss >> result;
    // result = "this"

    return result;
}

我的期望是,如果m_settings [setting]为"this is a test" ,则将在我的get函数中返回相同的字符串。 同时,我也不想通过对ss.str()进行硬编码ss.str()字符串使用其他函数来破坏模板。

您必须准确确定想要字符串的行为。 如果要提取整行,可以使用std::getline() 或者在这种情况下,也许只return this->m_settings[setting];

无论您最终做什么,解决方案都是将变体行为归类get<std::string>特殊化

请注意,专用行为与主代码的行为不会相差太远,因为这可能会使您的用户(包括您自己!)感到困惑。

这是3种方式:

  1. 就像我在评论中说的那样,您可以专门使用get<std::string>函数, get<std::string>从那里调用std::getline()

     template<typename T> T CConfig::get(const char* settings) { std::istringstream stream(m_settings[settings]); T t; assert(stream >> t); return t; } template<> std::string CConfig::get<std::string>(const char* settings) { std::istringstream stream(m_settings[settings]); T t; assert((std::getline(stream, t))); return t; } 

    这种方法的缺点是它会导致代码重复。

  2. 委托给使用主要和专用重载的辅助函数。

     template<typename T> T CConfig::get(const char* settings) { T t; assert( do_get(std::istringstream(m_settings[settings]) >> std::skipws, t); ); return t; } template<typename T> bool do_get(std::istringstream& stream, T& data) { return stream >> data; } template<> bool do_get(std::istringstream& stream, std::string& data) { return std::getline(stream, data); } 
  3. 如果您有则只需使用if constexpr

     template<class T> T CConfig::get(const char* settings) { T t; std::istringstream stream(m_settings[settings]); if constexpr(std::is_same_v<T, std::string>) { assert((std::getline(stream, t))); } else { assert(stream >> t); } return t; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM