Я работаю с открытым исходным кодом UNIX, который реализован на С++, и мне нужно изменить код, чтобы заставить его делать то, что я хочу. Я хотел бы внести минимальные изменения в надежде на то, что мой патч будет принят вверх по течению. Решения, реализуемые в стандартном С++ и не создающие больше внешних зависимостей, являются предпочтительными.
Вот моя проблема. У меня есть класс С++ - пусть он называет его "A", который в настоящее время использует fprintf() для печати своих сильно форматированных структур данных в указатель файла. В своей функции печати он также рекурсивно называет идентично определенные функции печати нескольких классов-членов (пример "B" ). Существует еще один класс C, который имеет член std::string "foo", который должен быть установлен в результатах print() экземпляра A. Подумайте об этом как о функции-члене to_str() для A.
В псевдокоде:
class A {
public:
...
void print(FILE* f);
B b;
...
};
...
void A::print(FILE *f)
{
std::string s = "stuff";
fprintf(f, "some %s", s);
b.print(f);
}
class C {
...
std::string foo;
bool set_foo(std::str);
...
}
...
A a = new A();
C c = new C();
...
// wish i knew how to write A to_str()
c.set_foo(a.to_str());
Я должен упомянуть, что C довольно стабилен, но A и B (и остальные члены A) находятся в состоянии потока, поэтому чем меньше изменяется код, тем лучше. Также необходимо сохранить текущий интерфейс печати (FILE * F). Я рассмотрел несколько подходов к реализации A:: to_str(), каждый из которых имеет преимущества и недостатки:
-
Измените вызовы на fprintf() на sprintf()
- Мне не пришлось бы переписывать любые строки формата
- print() может быть переопределена как: fprint (f, this.to_str());
- Но мне нужно было бы вручную выделить char [] s, слить много строк c и, наконец, преобразовать массив символов в std::string
-
Попробуйте поймать результаты a.print() в потоке строк
- Мне пришлось бы преобразовать все строки формата в < < < Выходной формат. Есть сотни fprintf() s для преобразования: - {
- print() пришлось бы переписать, потому что нет стандартного способа, который я знаю для создания потока вывода из дескриптора файла UNIX (хотя this парень говорит, что это возможно).
-
Использовать строку Boost формат библиотеки
- Дополнительные внешние зависимости. Тьфу.
- Синтаксис формата отличается от printf() раздражающим:
printf (format_str, args) → cout < boost:: format (format_str)% arg1% arg2% etc
-
Используйте Qt QString:: asprintf()
- Другая внешняя зависимость.
Итак, я исчерпал все возможные варианты? Если да, то какой, по вашему мнению, мой лучший выбор? Если нет, что я забыл?
Спасибо.