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

C++ 尝试使用可变模板定义类型,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我是一个全新的可变模板,所以请容忍我在这里 我正试图将我的量纲分析库带入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

我是一个全新的可变模板,所以请容忍我在这里

我正试图将我的量纲分析库带入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>>;
使用velocity\u dimension=std::tuple;
我一直在绞尽脑汁研究可变模板以及如何获得我想要的界面。我一直在尝试:

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

我想这说明了我有多不明白这些东西应该如何工作。

你想要的东西是接受可变数量的整数,而不是类型,所以模板参数列表中不应该有
typename

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

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

我想你只是想:

template<int... I>
  using make_dimension = std::tuple<std::ratio<I>...>;
模板
使用make_dimension=std::tuple;
这将获取一个整数参数包,然后将其展开为
std::ratio
专门化的列表,并将该批次包装在一个元组中

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