namespace Rose
{
template<typename T>
struct RemoveReference
{
typedef T Type;
};
template<typename T>
struct RemoveReference<T &>
{
typedef T Type;
};
template<typename... Elems>
class Tuple;
template<typename First, typename... Elems>
class Tuple<First, Elems...>
{
public:
Tuple(First a, Elems... more)
: More(more...), Element(a)
{
}
Tuple<First, Elems...> & operator=(const Tuple<typename RemoveReference<First>::Type,
typename RemoveReference<Elems>::Type...> & rhs)
{
this->Element = rhs.Element;
this->More = rhs.More;
return *this;
}
private:
Tuple<Elems...> More;
First Element;
};
template<typename Only>
class Tuple<Only>
{
public:
Tuple(Only a) : Element(a)
{
}
Tuple<Only> & operator=(const Tuple<typename RemoveReference<Only>::Type> & rhs)
{
this->Element = rhs.Element;
return *this;
}
private:
Only Element;
};
}
int main()
{
Rose::Tuple<int, float, int> t(1, 1.f, 2);
}
bmFtZXNwYWNlIFJvc2UKewogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBSZW1vdmVSZWZlcmVuY2UKICAgIHsKICAgICAgICB0eXBlZGVmIFQgVHlwZTsKICAgIH07CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBSZW1vdmVSZWZlcmVuY2U8VCAmPgogICAgewogICAgICAgIHR5cGVkZWYgVCBUeXBlOwogICAgfTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBFbGVtcz4KICAgIGNsYXNzIFR1cGxlOwogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUuLi4gRWxlbXM+CiAgICBjbGFzcyBUdXBsZTxGaXJzdCwgRWxlbXMuLi4+CiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgVHVwbGUoRmlyc3QgYSwgRWxlbXMuLi4gbW9yZSkKICAgICAgICAgICAgOiBNb3JlKG1vcmUuLi4pLCBFbGVtZW50KGEpCiAgICAgICAgewogICAgICAgIH0KICAgICAgICAKICAgICAgICBUdXBsZTxGaXJzdCwgRWxlbXMuLi4+ICYgb3BlcmF0b3I9KGNvbnN0IFR1cGxlPHR5cGVuYW1lIFJlbW92ZVJlZmVyZW5jZTxGaXJzdD46OlR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSZW1vdmVSZWZlcmVuY2U8RWxlbXM+OjpUeXBlLi4uPiAmIHJocykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMtPkVsZW1lbnQgPSByaHMuRWxlbWVudDsKICAgICAgICAgICAgdGhpcy0+TW9yZSA9IHJocy5Nb3JlOwoKICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgIH0KCiAgICBwcml2YXRlOgogICAgICAgIFR1cGxlPEVsZW1zLi4uPiBNb3JlOwogICAgICAgIEZpcnN0IEVsZW1lbnQ7CiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPbmx5PgogICAgY2xhc3MgVHVwbGU8T25seT4KICAgIHsKICAgIHB1YmxpYzoKICAgICAgICBUdXBsZShPbmx5IGEpIDogRWxlbWVudChhKQogICAgICAgIHsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgVHVwbGU8T25seT4gJiBvcGVyYXRvcj0oY29uc3QgVHVwbGU8dHlwZW5hbWUgUmVtb3ZlUmVmZXJlbmNlPE9ubHk+OjpUeXBlPiAmIHJocykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMtPkVsZW1lbnQgPSByaHMuRWxlbWVudDsKCiAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICB9CgogICAgcHJpdmF0ZToKICAgICAgICBPbmx5IEVsZW1lbnQ7CiAgICB9Owp9CgppbnQgbWFpbigpCnsKICAgIFJvc2U6OlR1cGxlPGludCwgZmxvYXQsIGludD4gdCgxLCAxLmYsIDIpOwp9