创建从可变参数模板包派生的类型的元组

问题描述 投票:2回答:1

[给定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> );

如何编写带有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>;
};

使得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::index_sequence解压缩std::make_tuple()。我会解释为什么我的尝试失败的原因,甚至std::index_sequence正确的工具也无法解释。但是我对解决所提出的问题最感兴趣。

c++ templates c++17 variadic-templates template-meta-programming
1个回答
5
投票

[如何根据参数包来生成派生类型(例如矩阵)的元组,以致可变参数的第n个元素生成Matrix<n, n+1> [?]

© www.soinside.com 2019 - 2024. All rights reserved.