#include <iostream>
#include <type_traits>
struct A{
char* ka;
};
struct B{
char* baa;
};
template<typename T0, typename T1>
struct my_pair{
my_pair(T0 el0, T1 el1): el0(el0), el1(el1) {}
T0 el0;
T1 el1; // may be next pair
};
template<int i, int current = 0, typename T>
auto constexpr get_my(const T& t, typename std::enable_if< i==current >::type* = 0) -> decltype(t.el0)
{
return t.el0;
}
template<int i, int current, typename T>
auto constexpr get_my(const T& t, typename std::enable_if< i!=current >::type* = 0) ->
decltype( get_my<i, current+1>(t.el1) )
{
return get_my<i, current+1>(t.el1);
}
template<int i, typename T>
auto constexpr get_my(const T& t, typename std::enable_if< i!=0 >::type* = 0) ->
decltype( get_my<i, 1>(t.el1) )
{
return get_my<i, 1>(t.el1);
}
int main()
{
my_pair<int, my_pair<B,double>> p1(12.789, {B(), 3.14} );
auto el1 = get_my<1>(p1);
int t =1;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgQXsKICBjaGFyKiBrYTsKfTsKCnN0cnVjdCBCewogIGNoYXIqIGJhYTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4Kc3RydWN0IG15X3BhaXJ7CiAgICBteV9wYWlyKFQwIGVsMCwgVDEgZWwxKTogZWwwKGVsMCksIGVsMShlbDEpIHt9CiAgICBUMCBlbDA7CiAgICBUMSBlbDE7IC8vIG1heSBiZSBuZXh0IHBhaXIKfTsKCnRlbXBsYXRlPGludCBpLCBpbnQgY3VycmVudCA9IDAsIHR5cGVuYW1lIFQ+CmF1dG8gY29uc3RleHByIGdldF9teShjb25zdCBUJiB0LCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgaT09Y3VycmVudCA+Ojp0eXBlKiA9IDApIC0+IGRlY2x0eXBlKHQuZWwwKQp7CiAgICByZXR1cm4gdC5lbDA7Cn0KCnRlbXBsYXRlPGludCBpLCBpbnQgY3VycmVudCwgdHlwZW5hbWUgVD4KYXV0byBjb25zdGV4cHIgZ2V0X215KGNvbnN0IFQmIHQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBpIT1jdXJyZW50ID46OnR5cGUqID0gMCkgLT4KICAgIGRlY2x0eXBlKCBnZXRfbXk8aSwgY3VycmVudCsxPih0LmVsMSkgKQp7CiAgICByZXR1cm4gZ2V0X215PGksIGN1cnJlbnQrMT4odC5lbDEpOwp9Cgp0ZW1wbGF0ZTxpbnQgaSwgdHlwZW5hbWUgVD4KYXV0byBjb25zdGV4cHIgZ2V0X215KGNvbnN0IFQmIHQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBpIT0wID46OnR5cGUqID0gMCkgLT4KICAgIGRlY2x0eXBlKCBnZXRfbXk8aSwgMT4odC5lbDEpICkKewogICAgcmV0dXJuIGdldF9teTxpLCAxPih0LmVsMSk7Cn0KCmludCBtYWluKCkKewogICAgbXlfcGFpcjxpbnQsIG15X3BhaXI8Qixkb3VibGU+PiBwMSgxMi43ODksIHtCKCksIDMuMTR9ICk7CgogICAgYXV0byBlbDEgPSBnZXRfbXk8MT4ocDEpOwogICAgaW50IHQgPTE7Cn0=