Home > Back-end >  Std::istream& as function parameter
Std::istream& as function parameter

Time:12-19

What is the best way to make a program that reads the elements from the input until the EOF and returns the container of read elements? This is what I have to do

p.h file:

#pragma once
#include <list>
#include <iostream>

typedef double Element;

template<typename T>
std::list<T> read(std::istream& u);

This is what I tried:

#pragma once
#include <list>
#include <iostream>

typedef double Element;

template<typename T>
std::list<T> read(std::istream& u){

  while(u){
   
   std::list<T> l;
   l.push_front(u);
   return l;

  }

}


p.cpp file:

#include "p.h"
#include <iostream>



int main(){
  double u;
  std::cin>>u;
 
  std::list<double> l=read(u);




}

What exactly do I have to pass as an argument the a main function? I tried passing an std::cin but it doesn't work. It could also be because read function is not defined properly. Also I don't understand what's the point of typedef being double if we are making generic functions.

CodePudding user response:

When you do l.push_front(u) you are trying to store the istream in the list. You need to read a T from the stream and store that instead. Also note that you need to declare l outside the loop in order to be able to read all values and then return l:

template<typename T>
std::list<T> read(std::istream& u){
  T tmp;
  std::list<T> l;

  while(u >> tmp){
     l.push_front(tmp);
  }

  return l;
}

Then specify the type you want to read from the stream by supplying it as a template parameter:

int main(){
  auto l=read<double>(std::cin);
}
  • Related