2013-04-05 2 views
-1

Как реализовать ostream-like класс с нуля используя printf?
Для меня выглядит как проблема в выборе строки формата, который фактически равен идентифицирующей input`s типа и лечения точностиostream implementatuon using printf

ответ

1

Я предполагаю, что вы имеете в виду то, что перегружает operator<< путем «в ostream -как класса». Легко определить тип аргумента функции, просто имея перегрузки. Например, у вас могут быть:

ostreamlike& ostreamlike::operator<<(int x) 
{ 
    printf("%d", x); 
    return *this; 
} 

ostreamlike& ostreamlike::operator<<(float x) 
{ 
    printf("%f", x); 
    return *this; 
} 

Формат выходного сигнала определяется по выбранной перегрузке.

0

Это зависит от того, насколько близко к реальным 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. На самом деле очень мало кода.

1

Подумайте, это может быть что-то вроде этого

#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; 
}