C++0x: How can I access variadic tuple members by index at runtime?
- by nonoitall
I have written the following basic Tuple template:
template <typename... T>
class Tuple;
template <uintptr_t N, typename... T>
struct TupleIndexer;
template <typename Head, typename... Tail>
class Tuple<Head, Tail...> : public Tuple<Tail...> {
    private:
    Head element;
    public:
    template <uintptr_t N>
    typename TupleIndexer<N, Head, Tail...>::Type& Get() {
        return TupleIndexer<N, Head, Tail...>::Get(*this);
    }
    uintptr_t GetCount() const {
        return sizeof...(Tail) + 1;
    }
    private:
    friend struct TupleIndexer<0, Head, Tail...>;
};
template <>
class Tuple<> {
    public:
    uintptr_t GetCount() const {
        return 0;
    }
};
template <typename Head, typename... Tail>
struct TupleIndexer<0, Head, Tail...> {
    typedef Head& Type;
    static Type Get(Tuple<Head, Tail...>& tuple) {
        return tuple.element;
    }
};
template <uintptr_t N, typename Head, typename... Tail>
struct TupleIndexer<N, Head, Tail...> {
    typedef typename TupleIndexer<N - 1, Tail...>::Type Type;
    static Type Get(Tuple<Head, Tail...>& tuple) {
        return TupleIndexer<N - 1, Tail...>::Get(*(Tuple<Tail...>*) &tuple);
    }
};
It works just fine, and I can access elements in array-like fashion by using tuple.Get<Index() - but I can only do that if I know the index at compile-time.  However, I need to access elements in the tuple by index at runtime, and I won't know at compile-time which index needs to be accessed.  Example:
int chosenIndex = getUserInput();
cout << "The option you chose was: " << tuple.Get(chosenIndex) << endl;
What's the best way to do this?