Tuple
#include <iostream>
#include <tuple>
#include <string>
#include <typeinfo>

int main(int argc, char *argv[])
{
	//initialization
	std::tuple<std::string, int>  planet("Earth", 4);
	auto address = std::make_tuple("US", "VA", "Yorktown", 1);

	//access
	std::cout<<std::get<0>(planet)<<" "<<std::get<1>(planet)<<std::endl;
	std::cout<<std::get<0>(address)<<" "<<std::get<1>(address)<<" "<<std::get<2>(address)<<" "<<std::get<3>(address)<<std::endl;

	//tie
	std::string city;
	int index;
	std::tie(std::ignore, std::ignore, city, index) = address;
	std::cout<<city<<" "<<index<<std::endl;

	//tuple_size
	std::cout<<std::tuple_size<decltype(address)>::value<<std::endl;

	//tuple_element
	std::cout<<typeid(decltype(address)).name()<<std::endl;
	std::cout<<typeid(std::tuple_element<3, decltype(address)>::type).name()<<std::endl;

	//forward_as_tuple, constructs a tuple object with rvalue references
	std::string greeting = "Hello";
	std::tuple<std::string, int> person = std::forward_as_tuple(greeting+" World!", 20);
	std::cout<<std::get<0>(person)<<" "<<std::get<1>(person)<<std::endl;

	//tuple_cat, construct a tuple by concatenate tuples
	auto merge = std::tuple_cat(planet, address);
	std::cout<<std::get<0>(merge)<<" "<<std::get<1>(merge)<<" "<<std::get<2>(merge)<<" "<<std::get<3>(merge)<<" "<<std::get<4>(merge)<<" "<<std::get<5>(merge)<<std::endl;

	return 0;
}
			
Reference