#include <iostream>
class Foo
{
public:
Foo() : is{1,2,3,4,5,6,7,8,9,10},ds{1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.1} {}
template <typename T> struct type_c{};
template <size_t I> struct int_c{};
template<typename T,size_t I>
auto get()
{ return get_impl(type_c<T>(),int_c<I>()); }
private:
template <size_t I>
auto get_impl(type_c<int>,int_c<I>)
{ return is[I]; }
template <size_t I>
auto get_impl(type_c<double>,int_c<I>)
{ return ds[I]; }
int is[10];
double ds[10];
};
int main() {
Foo foo;
int i = foo.get<int,0>();
double d = foo.get<double,2>();
std::cout << i << " " << d << std::endl;
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIEZvbwp7CnB1YmxpYzoKICAgIEZvbygpIDogaXN7MSwyLDMsNCw1LDYsNyw4LDksMTB9LGRzezEuMSwyLjIsMy4zLDQuNCw1LjUsNi42LDcuNyw4LjgsOS45LDEwLjF9IHt9CgoJCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHR5cGVfY3t9OwoJdGVtcGxhdGUgPHNpemVfdCBJPiBzdHJ1Y3QgaW50X2N7fTsKCQogICAgdGVtcGxhdGU8dHlwZW5hbWUgVCxzaXplX3QgST4KICAgIGF1dG8gZ2V0KCkgCgl7IHJldHVybiBnZXRfaW1wbCh0eXBlX2M8VD4oKSxpbnRfYzxJPigpKTsgfQpwcml2YXRlOgoKCXRlbXBsYXRlIDxzaXplX3QgST4KCWF1dG8gZ2V0X2ltcGwodHlwZV9jPGludD4saW50X2M8ST4pIAoJeyByZXR1cm4gaXNbSV07IH0KCgl0ZW1wbGF0ZSA8c2l6ZV90IEk+CglhdXRvIGdldF9pbXBsKHR5cGVfYzxkb3VibGU+LGludF9jPEk+KSAKCXsgcmV0dXJuIGRzW0ldOyB9CgkKCglpbnQgaXNbMTBdOwoJZG91YmxlIGRzWzEwXTsKfTsKaW50IG1haW4oKSB7CiAgICBGb28gZm9vOwoKCWludCBpID0gZm9vLmdldDxpbnQsMD4oKTsKCWRvdWJsZSBkID0gZm9vLmdldDxkb3VibGUsMj4oKTsKCXN0ZDo6Y291dCA8PCBpIDw8ICIgIiA8PCBkIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9