尝试使用可变参数模板定义类型
问题描述:
我是可变参数模板的全新品牌,请耐心等待。尝试使用可变参数模板定义类型
我试图把我的三维分析库带入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>