String_numput<> facet没有写入字符串

时间:2018-01-02 11:45:50

标签: c++

我写了一个String_numput<>源自num_put<>的facet facet,以便写入字符串。 该程序基于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

这里似乎有什么问题?

感谢。

2 个答案:

答案 0 :(得分:0)

begin()

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

这有两个问题:

  1. 这是非法的:它会覆盖s.size()的空[开始,结束]范围的结尾,所以你可能会踩踏一些随机内存,
  2. 并且它不会扩展字符串,因此cout << s保持为零,因此back_inserter将插入损坏范围的零个字符。
  3. 您需要string::iterator而不是std::num_put - 这实际上会正确附加到您的字符串。

    注意 put两个模板参数,第二个是std::basic_string<C>::iterator的迭代器参数所需的类型。

    您明确将其设置为put,但如果您更改传递给mBinding.edtHeight.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) { if (mBinding.edtHeight.getText().length() == 2) { mBinding.edtHeight.setText(""); } } return false; } }); 的迭代器,则需要更改此第二个模板参数以匹配其类型。

答案 1 :(得分:0)

根据答案elsewhere,我按如下方式设计了解决方案:

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

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

解决方案正在发挥作用。