#include <iostream>
#include <tuple>
#include <type_traits>
#include <sstream>

template<size_t N, class... Args>
std::enable_if_t<(N >= sizeof...(Args)), void> read_nth_element(std::tuple<Args...> &t, std::istream &stream) {
}

template<size_t N, class... Args> 
std::enable_if_t<(N < sizeof...(Args)), void> read_nth_element(std::tuple<Args...> &t, std::istream &stream) {
	stream >> std::get<N>(t);
	read_nth_element<N + 1, Args...>(t, stream);
}


template<class... Args>
std::tuple<Args...> read_tuple(std::istream &stream) {
	std::tuple<Args...> result;
	read_nth_element<0, Args...>(result, stream);
	
	return result;
}


int main() {
	std::string str("a 10.0 123");
	std::stringstream stream(str);
	
	auto tuple = read_tuple<std::string, float, int>(stream);
	
	std::cout << std::get<0>(tuple) << " " << std::get<1>(tuple) << " " << std::get<2>(tuple) << std::endl;
}
