Я хочу сделать шаблон, в котором я могу ввести индекс, и он даст мне тип по этому индексу. Я знаю, что могу сделать это с decltype(std::get<N>(tup))
но я хотел бы реализовать это сам. Например, я хотел бы сделать это,
typename get<N, std::tuple<int, bool, std::string>>::type;
…и это даст мне тип в положении N - 1
(потому что массивы индексируются начиная с 0). Как я могу это сделать? Благодарю.
Вы можете использовать шаблон класса и частичные специализации, чтобы делать то, что вы хотите. (Обратите внимание, что 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
}
Эта черта уже существует, и она называется std::tuple_element
.
Вот живой пример что демонстрирует его использование.