Как реализовать ostream
-like класс с нуля используя printf
?
Для меня выглядит как проблема в выборе строки формата, который фактически равен идентифицирующей input`s типа и лечения точностиostream implementatuon using printf
ответ
Я предполагаю, что вы имеете в виду то, что перегружает operator<<
путем «в ostream
-как класса». Легко определить тип аргумента функции, просто имея перегрузки. Например, у вас могут быть:
ostreamlike& ostreamlike::operator<<(int x)
{
printf("%d", x);
return *this;
}
ostreamlike& ostreamlike::operator<<(float x)
{
printf("%f", x);
return *this;
}
Формат выходного сигнала определяется по выбранной перегрузке.
Это зависит от того, насколько близко к реальным ostream
вы хотите быть. Предполагая, что вы хотите сделать это правильно, вам также понадобится класс streambuf
. ostream
делает только форматирование, фактический ввод-вывод выполняется внутренним производным классом streambuf
. Поскольку streambuf
выполняет неформатированный ввод-вывод, вам нужно будет использовать fwrite
не printf
.
Если ваша цель - просто выполнить ввод-вывод на уже существующем указателе FILE*
, это путь. Вы получаете один класс от streambuf
, скажем streambuf_with_FILE
, а затем вы получаете другой класс от ostream
, скажем ostream_with_FILE
. streambuf_with_FILE
переопределяет соответствующие методы для ввода фактического ввода-вывода, а ostream_with_FILE
имеет внутренний объект streambuf_with_FILE
. На самом деле очень мало кода.
Подумайте, это может быть что-то вроде этого
#include <stdio.h>
class ostreamlike {
public:
ostreamlike(FILE* f_): f(f_) {}
ostreamlike& write(int n) {
fprintf(f, "%d", n);
return *this;
}
ostreamlike& write(const char* n) {
fprintf(f, "%s", n);
return *this;
}
private:
FILE* f;
};
// operator for types that is supported ostreamlike internally
template <typename type>
ostreamlike& operator<<(ostreamlike& stream, const type& data) {
return stream.write(data);
}
// external implementations to write using ostreamlike
ostreamlike& operator<<(ostreamlike& stream, bool data) {
return stream.write(data ? "true" : "false");
}
int main() {
ostreamlike s(stdout);
s << "hello " << 1 << " : " << true << "\n";
return 0;
}