String_numput<>方面不写入字符串

String_numput<> facet not writing to string

本文关键字:字符串 方面不 gt lt String numput      更新时间:2023-10-16

为了写入字符串,我编写了一个派生自num_put<>分面的String_numput<>分面。该程序基于Stroustrup给出的示例:

/// A num_put<> facet specialization that writes to a string
template<typename C>
class String_numput : public std::num_put<
                         C,
                         typename std::basic_string<C>::iterator>
{
public:
   String_numput() :
      /// this facet won't go into a locale;
      /// it has a manually controlled lifetime
      std::num_put<C, typename std::basic_string<C>::iterator> {1}
   {
   }
};

测试如下:

using namespace std;
string s {};

void test(long i,
          string& s,
          int pos)
{
   String_numput<char> f;
   /// Format i into s at position pos;
   /// use cout's formatting rules
   f.put(s.begin() + pos, cout, ' ', i);
   cout << s;
}

int main()
{
   test(4567.9, s, 0);
   cout << "completed" << endl;
}

http://coliru.stacked-crooked.com/a/f4e8386682471e7d

但是,不会向字符串写入任何内容。O/P 是:

completed

这里似乎有什么问题?

谢谢。

f.put(s.begin() + pos, cout, ' ', i);

第一个参数应该是输出迭代器,但你给它一个空字符串的begin()

这有两个问题:

  1. 这是非法的:它会覆盖s的空[开始,结束(范围的末尾,所以你可能正在践踏一些随机内存,并且
  2. 它不会扩展字符串,因此s.size()保持零,因此cout << s将插入损坏范围的零个字符。

您需要一个back_inserter而不是string::iterator - 这实际上会正确附加到您的字符串中。

请注意std::num_put有两个模板参数,第二个是迭代器参数put的预期类型。

您将其显式设置为 std::basic_string<C>::iterator ,但是如果您更改传递给 put 的迭代器,则需要更改第二个模板参数以匹配其类型。

基于其他地方的答案,我设计了如下解决方案:

1( String_numput :将在指定位置将数字写入字符串。字符串必须足够大以容纳数字。

2( String_numapp :将使用back_inserter将数字附加到字符串中。

解决方案正在起作用。