尝试使用可变模板定义类型

Trying to define types with variadic templates

本文关键字:定义 类型      更新时间:2023-10-16

我对可变模板是全新的,所以请耐心等待。

我正在努力将我的维度分析库带入21世纪,并升级到C++11。我希望能够定义元组类型,而不是实例。这基本上就是我想说的:

using velocity_dimension = make_dimension<1, 0, -1, 0, 0, 0, 0>;

结果应等于:

using velocity_dimension = std::tuple<std::ratio<1>, std::ratio<0>, std::ratio<-1>, std::ratio<0>, std::ratio<0>, std::ratio<0>, std::ratio<0>>;

我正在努力让我的大脑围绕着各种各样的模板以及如何获得我想要的界面。我一直在尝试:

template<typename T, typename ...Args>
using make_list = std::tuple < std::ratio<T>, make_list<Args>...>> ;

我认为这说明了我有多不理解这些东西应该如何工作。

您想要的东西需要可变数量的整数,而不是类型,因此模板参数列表中不应该有typename

类似地,在std::ratio<T>中,模板参数应该是整数,而不是类型。

您的递归make_list不起作用,因为您无法专门化别名模板,因此无法终止递归。您可以使用类模板执行类似的操作,并提供部分专门化来终止递归,但没有必要这样做。

我想你只想:

template<int... I>
  using make_dimension = std::tuple<std::ratio<I>...>;

这需要一个整数参数包,然后将其扩展为std::ratio<>专门化列表,并将该批封装在元组中。

这里的包扩展模式是std::ratio<I>...,这意味着参数包I中的每个元素i都将被std::ratio<i>替换,因此如果包是1, 2, 3,则扩展是std::ratio<1>, std::ratio<2>, std::ratio<3>