对于我正在开发的 API,我希望允许用户将自定义对象插入到ostream
. (想想内存有限的嵌入式系统中的数千万个 16 位/32 位/48 位对象。)
假设用户初始化底层上下文,并查找以下对象之一:
DDB ddb("xc5vlx330t");
Tilewire tw = ddb.lookUpTilewire("DSP_X34Y0", "DSP_IMUX_B5_3");
...
std::cout << complexDataStructure;
在一个完全不同的范围内,可能嵌套在远离用户显式代码的地方,我们可能需要将对象插入到一个不可用ostream
的对象中。ddb
os << tw;
tw 封装的实际值是97,594,974
,但期望的输出是这样的:
DSP_IMUX_B5_3@[263,84] DSP "DSP_X34Y0" (1488@77406)
为了使其工作,适当的插入运算符需要访问ddb
,但它不能依赖静态或全局变量或函数(出于多线程原因)。我想做的是允许用户请求和使用这样的流包装器:
ostream& wrappedCout = ddb.getWrappedOstream(std::cout);
返回的 ostream 子类将包括对 ddb 的引用,供需要它的特殊流插入器使用,以及对原始流的引用——std::cout
在这种情况下——它将转发其所有输出。
不幸的是,我提出的继承或组合方案编写起来很混乱(不是一个大问题),并且可能给用户带来问题(一个更大的问题)。关于如何优雅地使 ddb 可用于插入操作员的任何建议?我对 boost.Iostreams 知之甚少,但不确定它是否会对我有所帮助。