#include <iostream>
#include <tuple>
#include <string>
#include <cassert>
using namespace std;
struct A {
A() = default;
A(int v) : value_(v) {}
int hash() const { return value_; }
int value_;
};
struct B {
B() = default;
B(string v) : value_(v) {}
int hash() const { return value_.size(); }
string value_;
};
template<typename T> class hash_getter {
public:
hash_getter(T & t): kontener_(t) {}
template<typename Y, int I> Y & get_type() { return std::get<I>(kontener_); }
int get_hash(int index) {
switch (index) {
case 0: return std::get<0>(kontener_).hash();
case 1: return std::get<1>(kontener_).hash();
default: assert(!"dupa");
}
}
private:
T& kontener_;
};
int main() {
tuple<A, B> k(A(12), B("foo"));
hash_getter<decltype(k)> hasher(k);
// tutaj starczy wiedza podczas kompilacji
cout << hasher.get_type<B, 1>().value_ << endl;
int index;
cout << "chcesz hash ktorego obiektu?: ";
cin >> index;
cout << index << " hash " << hasher.get_hash(index) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBIHsKCUEoKSA9IGRlZmF1bHQ7CglBKGludCB2KSA6IHZhbHVlXyh2KSB7fQoJaW50IGhhc2goKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KCQoJaW50IHZhbHVlXzsKfTsKCnN0cnVjdCBCIHsKCUIoKSA9IGRlZmF1bHQ7CglCKHN0cmluZyB2KSA6IHZhbHVlXyh2KSB7fQoJaW50IGhhc2goKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uc2l6ZSgpOyB9CgkKCXN0cmluZyB2YWx1ZV87Cn07CgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgaGFzaF9nZXR0ZXIgewpwdWJsaWM6CgloYXNoX2dldHRlcihUICYgdCk6IGtvbnRlbmVyXyh0KSB7fQoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBZLCBpbnQgST4gWSAmIGdldF90eXBlKCkgeyByZXR1cm4gc3RkOjpnZXQ8ST4oa29udGVuZXJfKTsgfQoJCglpbnQgZ2V0X2hhc2goaW50IGluZGV4KSB7CgkJc3dpdGNoIChpbmRleCkgewoJCQljYXNlIDA6IHJldHVybiBzdGQ6OmdldDwwPihrb250ZW5lcl8pLmhhc2goKTsKCQkJY2FzZSAxOiByZXR1cm4gc3RkOjpnZXQ8MT4oa29udGVuZXJfKS5oYXNoKCk7CgkJCWRlZmF1bHQ6IGFzc2VydCghImR1cGEiKTsKCQl9Cgl9CgkKcHJpdmF0ZToKCVQmIGtvbnRlbmVyXzsKfTsKCmludCBtYWluKCkgewoJdHVwbGU8QSwgQj4gayhBKDEyKSwgQigiZm9vIikpOwoJCgloYXNoX2dldHRlcjxkZWNsdHlwZShrKT4gaGFzaGVyKGspOwoJCgkvLyB0dXRhaiBzdGFyY3p5IHdpZWR6YSBwb2RjemFzIGtvbXBpbGFjamkKCWNvdXQgPDwgaGFzaGVyLmdldF90eXBlPEIsIDE+KCkudmFsdWVfIDw8IGVuZGw7CgkKCWludCBpbmRleDsKCWNvdXQgPDwgImNoY2VzeiBoYXNoIGt0b3JlZ28gb2JpZWt0dT86ICI7CgljaW4gPj4gaW5kZXg7CgoJY291dCA8PCBpbmRleCA8PCAiIGhhc2ggIiA8PCBoYXNoZXIuZ2V0X2hhc2goaW5kZXgpIDw8IGVuZGw7CgoJcmV0dXJuIDA7Cn0=