String_numput<>方面不写入字符串
String_numput<> facet not writing to string
为了写入字符串,我编写了一个派生自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()
。
这有两个问题:
- 这是非法的:它会覆盖
s
的空[开始,结束(范围的末尾,所以你可能正在践踏一些随机内存,并且 - 它不会扩展字符串,因此
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将数字附加到字符串中。
解决方案正在起作用。
相关文章:
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- 使用 switch,但我想用字符串而不是 int 进行选择
- 如何对向量进行排序<浮点数,字符串>而不考虑字符串
- C++ - 重置字符串流不会重置获取位置或清除标志吗?
- 你能从"volatile const char*"构造一个字符串吗?(不使用`const_cast`
- 使用字符串而不是类型进行模板化
- 字符串代码不起作用
- 如何打印字符串而不是数字
- 检查C++中是否只有一个字符串变量不是 nullptr
- C++字符串引用不能共存
- 字符串函数不返回字符串? C++
- 字符串文本不能有外部链接的原因是什么?
- std::字符串替换不保留结尾?
- 我在内存泄漏和字符串方面遇到了一个非常奇怪的问题
- C 字符串永远不会在 gmock 中调用
- 使用字符串时不能重写多态性
- 删除字符串中不平衡的括号
- 使用CIN时,字符串变量不会被覆盖
- 当我们使用字符串而不是字符数组时如何处理字符串的字符
- String_numput<>方面不写入字符串