#include #include #include #include #include #include #include using namespace std; template void read(istream& is, T& t); namespace details { template void read(istream& is, T& t, long) { t = {}; } void read(istream& is, string& str, int) { getline(is, str); } template auto read(istream& is, T& t, int) -> decltype(is >> t, declval()) { is >> t; } template void read(istream& is, tuple& t, int) { (::read(is, get(t)), ...); } } template void read(istream& is, T& t) { details::read(is, t, 0); } int main() { { istringstream iss{""}; vector data{1, 2, 3}; read(iss, data); assert(data.empty()); } { istringstream iss{"123"}; int message{}; read(iss, message); assert(message == 123); } { istringstream iss{"Hello Santa!"}; string message{}; read(iss, message); assert(message == "Hello Santa!"); } { istringstream iss{"Pie is good!\n 3.1415"}; tuple message{}; read(iss, message); assert((message == make_tuple("Pie is good!", 3.1415))); } { istringstream iss{"1 2.3 abc"}; tuple message{}; read(iss, message); assert((message == make_tuple(1, 2.3, 'a', "bc"))); } }