Подтвердить что ты не робот

Как получить N-й тип из кортежа?

Я хочу создать шаблон, где я могу ввести индекс, и он даст мне тип в этом индексе. Я знаю, что могу сделать это с помощью decltype(std::get<N>(tup)), но я хотел бы реализовать это сам. Например, я хотел бы сделать это,

typename get<N, std::tuple<int, bool, std::string>>::type;

... и он даст мне тип в позиции N - 1 (потому что массивы индексируются начиная с 0). Как я могу это сделать? Спасибо.

4b9b3361

Ответ 1

Вы можете использовать шаблон класса и частичную специализацию, чтобы делать то, что вы хотите. (Обратите внимание, что std::tuple_element делает почти то же самое, что и другой ответ):

#include <tuple>
#include <type_traits>

template <int N, typename... Ts>
struct get;

template <int N, typename T, typename... Ts>
struct get<N, std::tuple<T, Ts...>>
{
    using type = typename get<N - 1, std::tuple<Ts...>>::type;
};

template <typename T, typename... Ts>
struct get<0, std::tuple<T, Ts...>>
{
    using type = T;
};

int main()
{
    using var = std::tuple<int, bool, std::string>;
    using type = get<2, var>::type;

    static_assert(std::is_same<type, std::string>::value, ""); // works
}

Ответ 2

Эта черта уже существует и называется std::tuple_element.

Вот живой пример, который демонстрирует его использование.