自定义流操纵器,用于以任意基数流式传输整数
|
我可以使一个“ 0”对象以十六进制输出整数
std::cout << std::hex << 0xabc; //prints `abc`, not the base-10 representation
是否有适用于所有基地的通用机械手?就像是
std::cout << std::base(4) << 20; //I want this to output 110
如果有一个,那么我没有其他问题了。
如果没有,那我可以写一个吗?是否不需要我访问“ 0”的私有实现详细信息?
请注意,我知道我可以编写一个接受数字并将其转换为字符串的函数,该字符串以任何基数表示该数字。或者,我可以使用已经存在的一种。我问的是自定义流操纵器-它们可能吗?
提前致谢
没有找到相关结果
已邀请:
5 个回复
箩冀娥
和
在流中存储一些数据。 创建一个自定义
构面,该构面将查找您的操纵器并应用操纵。 这是代码... 编辑:请注意,我不确定我在这里是否正确处理了
标志-因为我实际上不知道其用途。 编辑2:我找出ѭ7的含义,并更新了代码来处理。 编辑3:在
中添加了一个调用,以显示默认情况下如何使所有标准流类支持新的流操纵器,而不是必须
。
稀瓣囊
厦惫
,
,
),这些成员使您可以在流中的数组中分配位置,并在其中读取/写入数据。这样,流操纵器本身是完全可能的。您基本上会使用ѭ4来在流的数组中分配一个点来保存当前基数,插入运算符在转换数字时将使用该点。 我看不到解决方案的问题相当简单:标准库已经提供了一个ѭ16来将ѭ17插入流中,并且它显然不知道您的假设数据为转换奠定了基础。您不能重载它,因为它需要与现有签名完全相同的签名,因此您的重载将是模棱两可的。
,
等的重载是成员函数的重载。我想,如果您想做的足够厉害,可以使用模板重载
。如果我没记错的话,那将比库提供的非模板函数的精确匹配更好。您仍然会违反规则,但是如果将这样的模板放在命名空间std中,则至少有一定机会可以使用它。
柑恫祟
这是测试代码:
输出:
在线演示:http://www.ideone.com/BWhW5 局限性: 基本不能更改两次。所以这将是一个错误:
使用ѭ25after后不能使用其他机械手:
使用
后不能使用
:
拈吉勉犬姆
其中“ 25”是提供流插入运算符的对象(无需返回临时“ 32”)。