#include <iostream>
#include <string>
#include <tuple>
// helper function to print a tuple of any size
template<class Tuple, std::size_t N>
struct TuplePrinter {
static void print(const Tuple& t)
{
TuplePrinter<Tuple, N-1>::print(t);
std::cout << ", " << std::get<N-1>(t);
}
};
template<class Tuple>
struct TuplePrinter<Tuple, 1> {
static void print(const Tuple& t)
{
std::cout << std::get<0>(t);
}
};
template<class Tuple>
struct TuplePrinter<Tuple, 0> {
static void print(const Tuple& t)
{
}
};
template<class... Args>
void print(const std::tuple<Args...>& t)
{
std::cout << "(";
TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
std::cout << ")\n";
}
struct Row
{
template <int N, typename ... Args> struct Helper;
template <typename Arg1> struct Helper<1, Arg1>
{
static std::tuple<Arg1> getResult(Row& r)
{
return std::make_tuple(r.getResult<Arg1>(0));
}
};
template <int N, typename Arg1, typename ... Args>
struct Helper<N, Arg1, Args...>
{
static std::tuple <Arg1, Args ...> getResult(Row& r)
{
return std::tuple_cat(std::make_tuple(r.getResult<Arg1>(N-1)),
Helper<N-1, Args...>::getResult(r));
}
};
template <typename Arg> Arg getResult(int index)
{
// This is where the value needs to be extracted from the row.
// It is a dummy implementation for testing purposes.
return Arg{};
}
template <typename ... Args>
std::tuple <Args ...> getResult()
{
return Helper<sizeof...(Args), Args...>::getResult(*this);
}
};
int main()
{
Row r;
auto res1 = r.getResult<std::string>();
auto res2 = r.getResult<int>();
auto res3 = r.getResult<int, double, int>();
auto res4 = r.getResult<int, int, double, double>();
auto res5 = r.getResult<std::string, std::string, int, int, double, double>();
print(res1);
print(res2);
print(res3);
print(res4);
print(res5);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHVwbGU+CgovLyBoZWxwZXIgZnVuY3Rpb24gdG8gcHJpbnQgYSB0dXBsZSBvZiBhbnkgc2l6ZQp0ZW1wbGF0ZTxjbGFzcyBUdXBsZSwgc3RkOjpzaXplX3QgTj4Kc3RydWN0IFR1cGxlUHJpbnRlciB7CiAgICBzdGF0aWMgdm9pZCBwcmludChjb25zdCBUdXBsZSYgdCkgCiAgICB7CiAgICAgICAgVHVwbGVQcmludGVyPFR1cGxlLCBOLTE+OjpwcmludCh0KTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIiwgIiA8PCBzdGQ6OmdldDxOLTE+KHQpOwogICAgfQp9OwogCnRlbXBsYXRlPGNsYXNzIFR1cGxlPgpzdHJ1Y3QgVHVwbGVQcmludGVyPFR1cGxlLCAxPiB7CiAgICBzdGF0aWMgdm9pZCBwcmludChjb25zdCBUdXBsZSYgdCkgCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6Z2V0PDA+KHQpOwogICAgfQp9OwogCnRlbXBsYXRlPGNsYXNzIFR1cGxlPgpzdHJ1Y3QgVHVwbGVQcmludGVyPFR1cGxlLCAwPiB7CiAgICBzdGF0aWMgdm9pZCBwcmludChjb25zdCBUdXBsZSYgdCkgCiAgICB7CiAgICB9Cn07CiAKdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4Kdm9pZCBwcmludChjb25zdCBzdGQ6OnR1cGxlPEFyZ3MuLi4+JiB0KSAKewogICAgc3RkOjpjb3V0IDw8ICIoIjsKICAgIFR1cGxlUHJpbnRlcjxkZWNsdHlwZSh0KSwgc2l6ZW9mLi4uKEFyZ3MpPjo6cHJpbnQodCk7CiAgICBzdGQ6OmNvdXQgPDwgIilcbiI7Cn0KCnN0cnVjdCBSb3cKewogICB0ZW1wbGF0ZSA8aW50IE4sIHR5cGVuYW1lIC4uLiBBcmdzPiBzdHJ1Y3QgSGVscGVyOwoKICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZzE+IHN0cnVjdCBIZWxwZXI8MSwgQXJnMT4KICAgewogICAgICBzdGF0aWMgc3RkOjp0dXBsZTxBcmcxPiBnZXRSZXN1bHQoUm93JiByKQogICAgICB7CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoci5nZXRSZXN1bHQ8QXJnMT4oMCkpOwogICAgICB9CiAgIH07CgogICB0ZW1wbGF0ZSA8aW50IE4sIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIC4uLiBBcmdzPgogICAgICBzdHJ1Y3QgSGVscGVyPE4sIEFyZzEsIEFyZ3MuLi4+CiAgICAgIHsKICAgICAgICAgc3RhdGljIHN0ZDo6dHVwbGUgPEFyZzEsIEFyZ3MgLi4uPiBnZXRSZXN1bHQoUm93JiByKQogICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OnR1cGxlX2NhdChzdGQ6Om1ha2VfdHVwbGUoci5nZXRSZXN1bHQ8QXJnMT4oTi0xKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWxwZXI8Ti0xLCBBcmdzLi4uPjo6Z2V0UmVzdWx0KHIpKTsKICAgICAgICAgfQogICAgICB9OwoKICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZz4gQXJnIGdldFJlc3VsdChpbnQgaW5kZXgpCiAgIHsKICAgICAgLy8gVGhpcyBpcyB3aGVyZSB0aGUgdmFsdWUgbmVlZHMgdG8gYmUgZXh0cmFjdGVkIGZyb20gdGhlIHJvdy4KICAgICAgLy8gSXQgaXMgYSBkdW1teSBpbXBsZW1lbnRhdGlvbiBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KICAgICAgcmV0dXJuIEFyZ3t9OwogICB9CgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uIEFyZ3M+CiAgICAgIHN0ZDo6dHVwbGUgPEFyZ3MgLi4uPiBnZXRSZXN1bHQoKQogICAgICB7CiAgICAgICAgIHJldHVybiBIZWxwZXI8c2l6ZW9mLi4uKEFyZ3MpLCBBcmdzLi4uPjo6Z2V0UmVzdWx0KCp0aGlzKTsKICAgICAgfQp9OwoKaW50IG1haW4oKQp7CiAgIFJvdyByOwogICBhdXRvIHJlczEgPSByLmdldFJlc3VsdDxzdGQ6OnN0cmluZz4oKTsKICAgYXV0byByZXMyID0gci5nZXRSZXN1bHQ8aW50PigpOwogICBhdXRvIHJlczMgPSByLmdldFJlc3VsdDxpbnQsIGRvdWJsZSwgaW50PigpOwogICBhdXRvIHJlczQgPSByLmdldFJlc3VsdDxpbnQsIGludCwgZG91YmxlLCBkb3VibGU+KCk7CiAgIGF1dG8gcmVzNSA9IHIuZ2V0UmVzdWx0PHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgaW50LCBpbnQsIGRvdWJsZSwgZG91YmxlPigpOwoKICAgcHJpbnQocmVzMSk7CiAgIHByaW50KHJlczIpOwogICBwcmludChyZXMzKTsKICAgcHJpbnQocmVzNCk7CiAgIHByaW50KHJlczUpOwoKICAgcmV0dXJuIDA7Cn0K