#include <iostream>
#include <tuple>
using namespace std;

struct Empty {};

template <class T>
auto print_mem(const T& obj)
{
	cout << &obj << " - " << (&obj + 1) << " (" << sizeof(obj) << ")" << endl;
}


int main() {
	std::tuple<int> t_i;
	std::tuple<Empty> t_e;
	std::tuple<int, Empty, Empty> t_iee;
	std::tuple<Empty, Empty, int> t_eei;
	std::tuple<int, Empty, Empty, int> t_ieei;
	
	cout << "std::tuple<int>" << endl;
	print_mem(t_i);
	cout << endl;
	
	cout << "std::tuple<Empty>" << endl;
	print_mem(t_e);
	cout << endl;
	
	cout << "std::tuple<int, Empty, Empty" << endl;
	print_mem(t_iee);
	print_mem(std::get<0>(t_iee));
	print_mem(std::get<1>(t_iee));
	print_mem(std::get<2>(t_iee));
	cout << endl;
	
	cout << "std::tuple<Empty, Empty, int>" << endl;
	print_mem(t_eei);
	print_mem(std::get<0>(t_eei));
	print_mem(std::get<1>(t_eei));
	print_mem(std::get<2>(t_eei));
	cout << endl;
	
	cout << "std::tuple<int, Empty, Empty, int>" << endl;
	print_mem(t_ieei);
	print_mem(std::get<0>(t_ieei));
	print_mem(std::get<1>(t_ieei));
	print_mem(std::get<2>(t_ieei));
	print_mem(std::get<3>(t_ieei));
	cout << endl;
}