将std::string转换为任意数字类型或std::string的成员函数模板

Member Function Template to Covert a std::string to Any Numeric Type or to a std::string

本文关键字:string std 函数模板 类型 成员 任意 转换 数字      更新时间:2023-10-16

请考虑成员函数模板。我的问题嵌入在评论表单中。

template<typename T>
GetValueResult GetValue(
                          const std::string &key,
                          T &val,
                          std::ios_base &(*manipulator)(std::ios_base &) = std::dec
                       )
{
   // This member function template is intended to work for all built-in
   // numeric types and std::string. However, when T = std::string, I get only
   // the first word of the map element's value. How can I fix this?
   // m_configMap is map<string, string>
   ConfigMapIter iter = m_configMap.find(key);
   if (iter == m_configMap.end())
      return CONFIG_MAP_KEY_NOT_FOUND;
   std::stringstream ss;
   ss << iter->second;
   // Convert std::string to type T. T could be std::string.
   // No real converting is going on this case, but as stated above
   // I get only the first word. How can I fix this?
   if (ss >> manipulator >> val)
      return CONFIG_MAP_SUCCESS;
   else
      return CONFIG_MAP_VALUE_INVALID;
}

流上的<<>>操作符被设计为使用以空格分隔的令牌。所以如果一个字符串看起来像"1 2",那么你的stringstream只会在第一个<<上读取1

如果你想要多个值,我建议你在流上使用循环。像这样的东西可能会…

//stringstream has a const string& constructor
std::stringstream ss(iter->second); 
while (ss >> manipulator >> value) { /* do checks here /* }

我建议你看看Boost,特别是lexical_cast,它可能会做你想要的开箱操作