Search code examples
c++templatesc++11compile-timetype-traits

How do I switch/select types during compile-time?


Is there a standard way for me to select a type at compile-time on an unsigned index in c++11?

For example, something like:

using type_0 = static_switch<0, T, U>;  // yields type T
using type_1 = static_switch<1, T, U>;  // yields type U

If there is a variadic-template version, it would be very useful.


Solution

  • This should work:

    template<std::size_t N, typename... T>
    using static_switch = typename std::tuple_element<N, std::tuple<T...> >::type;
    

    Another method:

    template<std::size_t N, typename T, typename... Ts>
    struct static_switch {
        using type = typename static_switch<N - 1, Ts...>::type;
    };
    template<typename T, typename... Ts>
    struct static_switch<0, T, Ts...> {
        using type = T;
    };