给定一个 size_t 值列表作为可变参数模板参数包,如何根据参数包以这样一种方式生成派生类型(例如矩阵)的元组,即可变参数的第 n 个元素生成Matrix<n, n+1>
。例如:
make_matrix_tuple<2,3,4,5>() == make_tuple( Matrix<2,3>, Matrix<3,4>, Matrix<4,5> );
如何编写接受 size_t 参数包的 make_matrix_tuple 函数?
我所说的派生类型并不是指继承,而是指依赖(?)。我不确定正确的术语是什么。
解压参数包很简单
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>;
};
So that 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>(); }
我正在尝试解压列表std::size_t
unpack_two 模板的大小,然后解压std::index_sequence
为了std::make_tuple()
.
我希望能解释一下为什么我的尝试失败了,或者甚至是std::index_sequence
正确的工具在这里。但我最感兴趣的是所提出问题的任何解决方案。