如何使用 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;