我写了一个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
这里似乎有什么问题?
感谢。
答案 0 :(得分:0)
begin()
第一个参数应该是输出迭代器,但是你给它一个空字符串的s
。
这有两个问题:
s.size()
的空[开始,结束]范围的结尾,所以你可能会踩踏一些随机内存,cout << s
保持为零,因此back_inserter
将插入损坏范围的零个字符。您需要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将数字附加到字符串。
解决方案正在发挥作用。