Этот класс не так хорош, как по моему мнению - вы предполагаете, что для "source" требуется m_read_ptr
, m_last_valid
и m_data
в качестве контекста. Однако, если это, например, файл, он не требует ни одного из них. Вместо этого переписайте этот класс как интерфейс или, что еще лучше, вообще не создавайте обобщенный класс c и не используйте шаблоны при обработке «источников», например, в псевдокоде:
class FileBuffer {
public:
explicit FileBuffer(File* f) : m_f(f) {}
int getchar() { return read(f, 1); }
private:
File* m_f;
};
template<class T>
void print_from_buffer_to_stdout(T& buf) {
std:: cout << buf.getchar();
}
int main() {
FileBuffer f = get_file_buffer(); // somehow
print_from_buffer_to_stdout(f);
}