私が取り組んでいるAPIの場合、ユーザーがカスタムオブジェクトをに挿入できるようにしたいのですostream
が、これらのオブジェクトはそれ自体では意味がなく、メモリに制約があり、コンテキストの追加のポインターや参照を含めることができません。(メモリが限られている組み込みシステムでは、数千万の16- / 32- / 48ビットオブジェクトを考えてみてください。)
ユーザーが基になるコンテキストを初期化し、次のオブジェクトの1つを検索するとします。
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をわずかに認識していますが、それがここで私を助けるかどうかはわかりません。