创建派生自可变参数模板包的类型元组
Creating tuple of types derived from Variadic Template Pack
给定一个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>;
};
因此,unpack_two<N, Type, Sizes...>::type
给出了第 N 个和第 (N+1( 个矩阵类型。
有了这个,我被困在对我来说似乎合理的东西上,但编译器不同意。
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
正确的工具。但我最感兴趣的是解决所提出的问题的任何解决方案。
如何
根据参数包制作派生类型(例如矩阵(的元组,以便可变参数的第n个元素生成
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> );
}
相关文章:
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将元组类型扩展为可变参数模板?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 创建派生自可变参数模板包的类型元组
- 枚举元组类型的最佳方法?
- 我无法在用forward_as_tuple创建的元组中按类型访问元素
- Boost.Hana:在 constexpr 上下文中将值元组转换为相应类型的元组
- 在C++中返回基元类型数组(Java比较)
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 如何将值元组中的相应值附加到相同类型的向量元组中
- 您自己的类型的结构化绑定,不是结构或元组(通过公共成员函数)
- 如何在编译器时动态获取元组内的变量类型C++?
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 使用每种类型的可变参数模板上的类模板初始化元组
- 在 c++17 中筛选类型元组
- 有没有办法将一对元组剥离为可变参数模板类型或实例化具有可变参数类型的东西?
- 从类型元组到通过调用模板函数返回的值数组
- 为什么不采用非类型部分专用元组?
- 以后可以解压缩类型元组吗?
- 如何根据表达式在Boost.Hana中是否有效来过滤类型元组