如何在C ++ 17中创建在编译时已知大小的修订类型元组?

时间:2018-11-15 11:22:00

标签: c++ c++17 variadic-templates template-meta-programming stdtuple

我想创建一个公共元素类型的元组类型,其长度在编译时是已知的。例如,如果我有

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 :(得分:1)

这可以通过递归来完成:

#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是否对于您要解决的任何任务来说都是更简单,直接的解决方案。

答案 1 :(得分:1)

没有递归,具有两个已声明(未定义)的辅助函数和一个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>>{} );
 }