Для 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 для использования специальными потоковыми вставками, которые в этом нуждались, и ссылку на исходный поток & mdash; std::cout
в этом случае & mdash; куда он будет пересылать весь свой вывод.
К сожалению, схемы наследования или компоновки, которые я придумала, являются грязными для кодирования (не огромной проблемой) и, возможно, проблематичными для пользователя (гораздо большая проблема). Любые предложения о том, как элегантно сделать ddb доступным для операторов вставки? Я немного знаю о повышении. Iostreams, но не уверен, что это поможет мне здесь.