Как создать кортеж типов исправлений, размер которых известен во время компиляции в C ++ 17? - PullRequest
0 голосов
/ 15 ноября 2018

Я хотел бы создать тип кортежа общего типа элемента, длина которого известна во время компиляции. Например, если у меня есть

static constexpr const std::size_t compiletime_size = 2;

using tuple_int_size_2 = magic (int, compiletime_size);

tuple_str_t_2 должен быть того же типа, что и std::tuple<int, int>

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Без рекурсии, с двумя объявленными (не определенными) вспомогательными функциями и using

template <typename T, std::size_t ... Is>
constexpr auto gft_helper (std::index_sequence<Is...> const &)
   -> decltype(std::make_tuple( ((void)Is, std::declval<T>())... ));

template <typename T, std::size_t N>
constexpr auto get_fixed_tuple ()
  -> decltype(gft_helper<T>(std::make_index_sequence<N>{}));

template <typename T, std::size_t N>
using tuple_fixed_type = decltype(get_fixed_tuple<T, N>());

Ниже приводится полный рабочий пример

#include <tuple>
#include <utility>

template <typename T, std::size_t ... Is>
constexpr auto gft_helper (std::index_sequence<Is...> const &)
   -> decltype(std::make_tuple( ((void)Is, std::declval<T>())... ));

template <typename T, std::size_t N>
constexpr auto get_fixed_tuple ()
  -> decltype(gft_helper<T>(std::make_index_sequence<N>{}));

template <typename T, std::size_t N>
using tuple_fixed_type = decltype(get_fixed_tuple<T, N>());

int main()
 {
   auto ft = tuple_fixed_type<long, 3u>{};

   static_assert( std::is_same<decltype(ft), std::tuple<long, long, long>>{} );
 }
0 голосов
/ 15 ноября 2018

Это можно сделать с помощью рекурсии:

#include <tuple>

template <size_t N, typename Head, typename... T>
struct magic {
    using tuple_type = typename magic<N - 1, Head, Head, T...>::tuple_type;
};

template <typename... T>
struct magic<1, T...> {
    using tuple_type = std::tuple<T...>;
};

int main()
{
    auto t = typename magic<3, int>::tuple_type{};
    return 0;
}

Интересно, однако, если бы std::array было бы намного более простым и простым решением для любой задачи, которую вы пытаетесь решить.

...