如何使用 std::num_put 自定义指针输出格式?
how to use std::num_put for custom pointer output formatting?
TLDR;
c++ iostream 指针的默认输出格式为 0xdeadbeef
。
我想要的是以 #xdeadbeef
.
形式输出的指针
问题
出于测试目的,我以 s 表达式的形式输出了一些 c++ 程序的内部数据,因此我将来可以选择使用 Common Lisp 来推理输出。
现在,十六进制数以 #xdeadbeef
的形式编写,iostream 默认使用 C/C++ 典型的 0x...
语法。
所以,经过一些阅读,我想我已经接近找到解决方案了……只是,至少在 cppreference.com 上,没有足够的(演示代码或解释)让我能够明白,我应该如何解决这个问题。
#include <iostream>
#include <locale>
#include <sstream>
#include <string>
struct lispy_num_put : std::num_put<char> {
iter_type do_put(iter_type s, std::ios_base& f,
char_type fill, const void* p) {
std::ostringstream oss;
oss << p;
std::string zwoggle{oss.str()};
if (zwoggle.length() > 2 && zwoggle.starts_with("0x")) {
zwoggle[0] = '#';
}
// ... NOW WHAT TO DO??? I.e how to send the string along?
}
};
// ...
如您所见,我现在拥有了我希望如何在输出中查看指针的字符串表示形式。只是我不清楚,现在如何将该字符串发送到输出流中。
稍后,我将不得不使用一些 imbue()
东西来让我的输出流使用这个结构。我想,那部分我自己能想通。
使用您的 iter_type s
参数输出字符。
*s++ = '#'; // outputs a hash
while (...) *s++ = ...; // outputs digits
return s;
TLDR;
c++ iostream 指针的默认输出格式为 0xdeadbeef
。
我想要的是以 #xdeadbeef
.
问题
出于测试目的,我以 s 表达式的形式输出了一些 c++ 程序的内部数据,因此我将来可以选择使用 Common Lisp 来推理输出。
现在,十六进制数以 #xdeadbeef
的形式编写,iostream 默认使用 C/C++ 典型的 0x...
语法。
所以,经过一些阅读,我想我已经接近找到解决方案了……只是,至少在 cppreference.com 上,没有足够的(演示代码或解释)让我能够明白,我应该如何解决这个问题。
#include <iostream>
#include <locale>
#include <sstream>
#include <string>
struct lispy_num_put : std::num_put<char> {
iter_type do_put(iter_type s, std::ios_base& f,
char_type fill, const void* p) {
std::ostringstream oss;
oss << p;
std::string zwoggle{oss.str()};
if (zwoggle.length() > 2 && zwoggle.starts_with("0x")) {
zwoggle[0] = '#';
}
// ... NOW WHAT TO DO??? I.e how to send the string along?
}
};
// ...
如您所见,我现在拥有了我希望如何在输出中查看指针的字符串表示形式。只是我不清楚,现在如何将该字符串发送到输出流中。
稍后,我将不得不使用一些 imbue()
东西来让我的输出流使用这个结构。我想,那部分我自己能想通。
使用您的 iter_type s
参数输出字符。
*s++ = '#'; // outputs a hash
while (...) *s++ = ...; // outputs digits
return s;