#include #include #include #include #include #include #include namespace details { void read(std::istream& is, std::string& out, int, int) { std::getline(is, out); } template auto read(std::istream& is, T& out, int, int) -> decltype( out.push_back( typename T::value_type{} ), std::declval() ) { typename T::value_type element { }; while (is >> element) { out.push_back(element); } } template auto read(std::istream& is, T& out, int, float) -> decltype( out.insert(std::end(out), typename T::value_type{} ), std::declval() ) { typename T::value_type element { }; while (is >> element) { out.insert(std::end(out), element); } } template void read(std::istream& is, T& out, float, float) { is >> out; } } template void read(std::istream& is, T& out) { return details::read(is, out, 0, 0); } int main() { { int value { }; std::istringstream iss { "37 38 39" }; read(iss, value); assert( value == 37 ); } { std::string value { }; std::istringstream iss { "a test line" }; read(iss, value); assert( value == "a test line" ); } { std::set value { }; std::istringstream iss { "cba" }; read(iss, value); assert(( value == std::set{ 'a', 'b', 'c' } )); } { std::vector value { }; std::istringstream iss { "1 4 2 3" }; read(iss, value); assert(( value == std::vector{ 1, 4, 2, 3 } )); } }