#include <iostream>
#include <string>

template < typename T > struct type_tuple_value 
{ 
    T value; 
    type_tuple_value ( T&& arg ) : value(std::forward<T>(arg)) {}
};

template < typename ...T > struct type_tuple : type_tuple_value<T>...
{
    template < typename ...Args > type_tuple ( Args&&... args ) :
	type_tuple_value<T>(std::forward<T>(args))... {}
    template < typename U > U& get() { return type_tuple_value<U>::value; }
    template < typename U > const U& get() const { return type_tuple_value<U>::value; }
};

int main() 
{
    int i = 15;
    type_tuple<int,double,std::string,bool> t ( i, 30.27, "foo", true );
    std::cout << t.get<double>() << ", " << t.get<int>() << ", " << t.get<bool>() 
	<< ", " << t.get<std::string>() 
	<< std::endl;
    return 0;
}