#include <string>
#include <cstdint>
#include <iostream>
#include <tuple>
#include <type_traits>
template <typename T, typename... Ts> struct get_index;
template <typename T, typename... Ts>
struct get_index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};
template <typename T, typename Tail, typename... Ts>
struct get_index<T, Tail, Ts...> :
std::integral_constant<std::size_t, 1 + get_index<T, Ts...>::value> {};
template <typename T, typename Tuple> struct get_index_in_tuple;
template <typename T, typename ... Ts>
struct get_index_in_tuple<T, std::tuple<Ts...>> : get_index<T, Ts...> {};
class Aggregate
{
public:
std::string asString() { return "Hello world"; }
uint32_t asInt() { return 42u; }
private:
// some conglomerate data
};
template <typename T>
T get(Aggregate& aggregate)
{
using types = std::tuple<uint32_t, std::string>;
auto funcs = std::make_tuple(&Aggregate::asInt, &Aggregate::asString);
return (aggregate.* (std::get<get_index_in_tuple<T, types>::value>(funcs)))();
}
int main()
{
Aggregate a;
std::cout << get<uint32_t>(a) << std::endl;
std::cout << get<std::string>(a) << std::endl;
//get<double>(a); // Fail to compile
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPiBzdHJ1Y3QgZ2V0X2luZGV4OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgZ2V0X2luZGV4PFQsIFQsIFRzLi4uPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDA+IHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRhaWwsIHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgZ2V0X2luZGV4PFQsIFRhaWwsIFRzLi4uPiA6CiAgICBzdGQ6OmludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAxICsgZ2V0X2luZGV4PFQsIFRzLi4uPjo6dmFsdWU+IHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFR1cGxlPiBzdHJ1Y3QgZ2V0X2luZGV4X2luX3R1cGxlOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLiBUcz4Kc3RydWN0IGdldF9pbmRleF9pbl90dXBsZTxULCBzdGQ6OnR1cGxlPFRzLi4uPj4gOiBnZXRfaW5kZXg8VCwgVHMuLi4+IHt9OwoKCmNsYXNzIEFnZ3JlZ2F0ZQp7CnB1YmxpYzoKICAgICBzdGQ6OnN0cmluZyBhc1N0cmluZygpIHsgcmV0dXJuICJIZWxsbyB3b3JsZCI7IH0KICAgICB1aW50MzJfdCBhc0ludCgpIHsgcmV0dXJuIDQydTsgfQpwcml2YXRlOgogICAgIC8vIHNvbWUgY29uZ2xvbWVyYXRlIGRhdGEKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpUIGdldChBZ2dyZWdhdGUmIGFnZ3JlZ2F0ZSkKewogICAgdXNpbmcgdHlwZXMgPSBzdGQ6OnR1cGxlPHVpbnQzMl90LCBzdGQ6OnN0cmluZz47CiAgICBhdXRvIGZ1bmNzID0gc3RkOjptYWtlX3R1cGxlKCZBZ2dyZWdhdGU6OmFzSW50LCAmQWdncmVnYXRlOjphc1N0cmluZyk7CgogICAgcmV0dXJuIChhZ2dyZWdhdGUuKiAoc3RkOjpnZXQ8Z2V0X2luZGV4X2luX3R1cGxlPFQsIHR5cGVzPjo6dmFsdWU+KGZ1bmNzKSkpKCk7Cn0KCmludCBtYWluKCkKewogICAgQWdncmVnYXRlIGE7CiAgICBzdGQ6OmNvdXQgPDwgZ2V0PHVpbnQzMl90PihhKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgZ2V0PHN0ZDo6c3RyaW5nPihhKSA8PCBzdGQ6OmVuZGw7CiAgICAvL2dldDxkb3VibGU+KGEpOyAvLyBGYWlsIHRvIGNvbXBpbGUKICAgIHJldHVybiAwOwp9Cg==