创建从 Variadic Template Pack 派生的类型的元组
Creating tuple of types derived from Variadic Template Pack
给定一个 size_t 值列表作为可变模板参数包,如何根据参数包以这种方式生成派生类型(例如 Matrix)的元组,即第 n 个元素可变参数生成 Matrix<n, n+1>
。例如:
make_matrix_tuple<2,3,4,5>() == make_tuple( Matrix<2,3>, Matrix<3,4>, Matrix<4,5> );
如何编写make_matrix_tuple函数接受size_t的参数包?
我所说的派生类型不是指继承而是依赖(?)。我不确定正确的术语是什么。
解包参数包很简单
template <typename ElementType, size_t... Sizes>
void make_tuple_of_vectors() { std::tuple < std::array<ElementType, Sizes> ... > tuple; }
但是我相信我对下一部分有点不知所措。
我正在尝试递归地从参数包中解压一对参数,如下所示:
template <typename Type, size_t size1, size_t size2>
struct dummy_matrix
{
size_t SIZE1 = size1;
size_t SIZE2 = size2;
using type = Type;
};
template <size_t Iterator, typename ElementType, size_t T, size_t... Sizes>
struct unpack_two
{
using type = typename unpack_two<Iterator - 1, ElementType, Sizes...>::type;
};
template<typename ElementType, size_t T, size_t T2, size_t... Sizes>
struct unpack_two<0, ElementType, T, T2, Sizes...>
{
using type = dummy_matrix<ElementType, T, T2>;
};
因此unpack_two<N, Type, Sizes...>::type
给出第N个和第(N+1)-n个矩阵类型。
有了这个,我坚持了一些对我来说似乎明智的事情,但编译器却严厉地反对。
template <size_t... Sizes, size_t... Is>
auto
foo_impl(std::index_sequence<Is...>) {
std::tuple < unpack_two<Is, float, Sizes ... >::type ... > tuple;
return tuple;
}
template <size_t... Args>
void foo()
{
auto vs = foo_impl<Args...>(std::make_index_sequence<sizeof...(Args)-1>{});
}
int main() { foo<6,9,12>(); }
我正在尝试为 unpack_two 模板解压 std::size_t
尺寸列表,然后为 std::make_tuple()
.
解压 std::index_sequence
我希望能解释为什么我的尝试失败,甚至是 std::index_sequence
正确的工具。但我最感兴趣的是对所提出问题的任何解决方案。
how does one make a tuple of derived types (e.g. Matrix) depending on the parameter pack in such a way, that n-th element of variadic generates Matrix<n, n+1>
[?]
也许在辅助函数中使用 constexpr
std::array
?
一个例子
#include <array>
#include <tuple>
#include <utility>
template <std::size_t, std::size_t>
struct Matrix
{ };
template <std::size_t ... Ds, std::size_t ... Is>
auto mmt_helper (std::index_sequence<Is...>)
{
constexpr std::array ca { Ds... };
return std::make_tuple(Matrix<ca[Is], ca[Is+1u]>{}...);
}
template <std::size_t ... Ds>
auto make_matrix_tuple ()
{ return mmt_helper<Ds...>(std::make_index_sequence<sizeof...(Ds)-1>{}); }
int main ()
{
auto mt = make_matrix_tuple<2,3,4,5>();
using T1 = decltype(mt);
using T2 = std::tuple<Matrix<2u, 3u>, Matrix<3u, 4u>, Matrix<4u, 5u>>;
static_assert( std::is_same_v<T1, T2> );
}
给定一个 size_t 值列表作为可变模板参数包,如何根据参数包以这种方式生成派生类型(例如 Matrix)的元组,即第 n 个元素可变参数生成 Matrix<n, n+1>
。例如:
make_matrix_tuple<2,3,4,5>() == make_tuple( Matrix<2,3>, Matrix<3,4>, Matrix<4,5> );
如何编写make_matrix_tuple函数接受size_t的参数包?
我所说的派生类型不是指继承而是依赖(?)。我不确定正确的术语是什么。
解包参数包很简单
template <typename ElementType, size_t... Sizes>
void make_tuple_of_vectors() { std::tuple < std::array<ElementType, Sizes> ... > tuple; }
但是我相信我对下一部分有点不知所措。 我正在尝试递归地从参数包中解压一对参数,如下所示:
template <typename Type, size_t size1, size_t size2>
struct dummy_matrix
{
size_t SIZE1 = size1;
size_t SIZE2 = size2;
using type = Type;
};
template <size_t Iterator, typename ElementType, size_t T, size_t... Sizes>
struct unpack_two
{
using type = typename unpack_two<Iterator - 1, ElementType, Sizes...>::type;
};
template<typename ElementType, size_t T, size_t T2, size_t... Sizes>
struct unpack_two<0, ElementType, T, T2, Sizes...>
{
using type = dummy_matrix<ElementType, T, T2>;
};
因此unpack_two<N, Type, Sizes...>::type
给出第N个和第(N+1)-n个矩阵类型。
有了这个,我坚持了一些对我来说似乎明智的事情,但编译器却严厉地反对。
template <size_t... Sizes, size_t... Is>
auto
foo_impl(std::index_sequence<Is...>) {
std::tuple < unpack_two<Is, float, Sizes ... >::type ... > tuple;
return tuple;
}
template <size_t... Args>
void foo()
{
auto vs = foo_impl<Args...>(std::make_index_sequence<sizeof...(Args)-1>{});
}
int main() { foo<6,9,12>(); }
我正在尝试为 unpack_two 模板解压 std::size_t
尺寸列表,然后为 std::make_tuple()
.
解压 std::index_sequence
我希望能解释为什么我的尝试失败,甚至是 std::index_sequence
正确的工具。但我最感兴趣的是对所提出问题的任何解决方案。
how does one make a tuple of derived types (e.g. Matrix) depending on the parameter pack in such a way, that n-th element of variadic generates
Matrix<n, n+1>
[?]
也许在辅助函数中使用 constexpr
std::array
?
一个例子
#include <array>
#include <tuple>
#include <utility>
template <std::size_t, std::size_t>
struct Matrix
{ };
template <std::size_t ... Ds, std::size_t ... Is>
auto mmt_helper (std::index_sequence<Is...>)
{
constexpr std::array ca { Ds... };
return std::make_tuple(Matrix<ca[Is], ca[Is+1u]>{}...);
}
template <std::size_t ... Ds>
auto make_matrix_tuple ()
{ return mmt_helper<Ds...>(std::make_index_sequence<sizeof...(Ds)-1>{}); }
int main ()
{
auto mt = make_matrix_tuple<2,3,4,5>();
using T1 = decltype(mt);
using T2 = std::tuple<Matrix<2u, 3u>, Matrix<3u, 4u>, Matrix<4u, 5u>>;
static_assert( std::is_same_v<T1, T2> );
}