#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4gc3RydWN0IHR5cGVfdHVwbGVfdmFsdWUgCnsgCiAgICBUIHZhbHVlOyAKICAgIHR5cGVfdHVwbGVfdmFsdWUgKCBUJiYgYXJnICkgOiB2YWx1ZShzdGQ6OmZvcndhcmQ8VD4oYXJnKSkge30KfTsKCnRlbXBsYXRlIDwgdHlwZW5hbWUgLi4uVCA+IHN0cnVjdCB0eXBlX3R1cGxlIDogdHlwZV90dXBsZV92YWx1ZTxUPi4uLgp7CiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIC4uLkFyZ3MgPiB0eXBlX3R1cGxlICggQXJncyYmLi4uIGFyZ3MgKSA6Cgl0eXBlX3R1cGxlX3ZhbHVlPFQ+KHN0ZDo6Zm9yd2FyZDxUPihhcmdzKSkuLi4ge30KICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVSA+IFUmIGdldCgpIHsgcmV0dXJuIHR5cGVfdHVwbGVfdmFsdWU8VT46OnZhbHVlOyB9CiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFUgPiBjb25zdCBVJiBnZXQoKSBjb25zdCB7IHJldHVybiB0eXBlX3R1cGxlX3ZhbHVlPFU+Ojp2YWx1ZTsgfQp9OwoKaW50IG1haW4oKSAKewogICAgaW50IGkgPSAxNTsKICAgIHR5cGVfdHVwbGU8aW50LGRvdWJsZSxzdGQ6OnN0cmluZyxib29sPiB0ICggaSwgMzAuMjcsICJmb28iLCB0cnVlICk7CiAgICBzdGQ6OmNvdXQgPDwgdC5nZXQ8ZG91YmxlPigpIDw8ICIsICIgPDwgdC5nZXQ8aW50PigpIDw8ICIsICIgPDwgdC5nZXQ8Ym9vbD4oKSAKCTw8ICIsICIgPDwgdC5nZXQ8c3RkOjpzdHJpbmc+KCkgCgk8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQ==