2014-10-08 75 views
1

我是可变参数模板的全新品牌,请耐心等待。尝试使用可变参数模板定义类型

我试图把我的三维分析库带入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>...>> ; 

我认为这只是说明我不明白这些东西应该如何工作。

回答

3

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

同样在std::ratio<T>模板参数应该是一个整数,而不是一个类型。

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

我觉得你只是想:

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

这需要整数参数包,然后将其扩展成的std::ratio<>特例列表,并包装了很多的元组。

这里的包扩展图案std::ratio<I>...这意味着在参数包的每个元素iI将与std::ratio<i>替换,因此,如果包装是1, 2, 3则扩展是std::ratio<1>, std::ratio<2>, std::ratio<3>