【发布时间】:2017-03-19 10:14:01
【问题描述】:
我们有模板类:
template<int i>
class A
{
...
};
但是如何声明模板类的打包器:
template<int... is>
Pack
{
private:
A<is...> attrs;
};
或者如何收集A类?
【问题讨论】:
标签: c++ c++11 templates variadic-templates
我们有模板类:
template<int i>
class A
{
...
};
但是如何声明模板类的打包器:
template<int... is>
Pack
{
private:
A<is...> attrs;
};
或者如何收集A类?
【问题讨论】:
标签: c++ c++11 templates variadic-templates
以std::tuple为例
#include <tuple>
template <int i>
class A
{ };
template <int... is>
class Pack
{ std::tuple<A<is>...> attrs; };
int main()
{
Pack<2,3,5,7,11,13> p;
}
另一种方式是通过继承
template <int i>
class A
{ };
template <int... is>
class Pack : A<is>...
{ };
int main()
{
Pack<2,3,5,7,11,13> p;
}
【讨论】:
我知道的最佳方法是使用类型列表:
template<class...> struct type_list{};
template<int...Is>
using a_pack = type_list<A<Is>...>;
使用类型列表,很容易进行转换或 对每个成员进行操作。例如,让我们用前面的代码创建一个 std:vector 的 type_list:
template<class> struct vectors_of;
template<class...As> struct vectors_of<type_list<As...>>{
using type=type_list<std::vector<As>...>;
};
using vectors_of_a = typename vectors_of<a_pack<1,2>>::type;
他们有很多关于类型列表的文档。这是基本工具之一 本书以来的元程序员:Modern C++ Design(使用 pre-c++11)。有了 C++11,使用起来就更简单了。
【讨论】: