如何实施ostream
- 仅使用printf
从头开始上课?
对我来说,看起来问题在于选择格式字符串,它实际上等于识别输入的类型和处理精度
答案 0 :(得分:1)
我认为你的意思是通过“operator<<
- 类”重载ostream
。只需通过重载就可以很容易地识别函数的参数类型。例如,您可能有:
ostreamlike& ostreamlike::operator<<(int x)
{
printf("%d", x);
return *this;
}
ostreamlike& ostreamlike::operator<<(float x)
{
printf("%f", x);
return *this;
}
输出的格式取决于选择的过载。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
这取决于你想要的真实ostream
的接近程度。假设你想要正确地做,你还需要一个streambuf
派生类。 ostream
只进行格式化,实际的I / O由内部streambuf
派生类完成。由于streambuf
执行未格式化的I / O,您需要使用fwrite
而不是printf
。
如果你的目标只是在已经存在的FILE*
指针上进行I / O,那么这就是你要走的路。您从streambuf
派生了一个类,比如streambuf_with_FILE
,然后从ostream
说ostream_with_FILE
派生另一个类。 streambuf_with_FILE
会覆盖执行实际I / O的适当方法,ostream_with_FILE
会有一个内部streambuf_with_FILE
对象。实际上只需要很少的代码。