有类型的静态向量吗?

时间:2013-07-11 05:25:14

标签: c++ templates

是否存在类型的静态(编译器时间)向量?例如,我可以通过给定的常量整数索引获取类型,如下面的

Vector<int, float>::Type<0> is int

Vector<int, float>::Type<1> is float

3 个答案:

答案 0 :(得分:4)

如果要在编译时操作类型向量,可以使用Boost.MPL库中的boost::mpl::vector。但要注意,你的头可能会爆炸。

using namespace boost::mpl;

typedef at_c<vector<int, float>, 0>::type t1; // int
typedef at_c<vector<int, float>, 1>::type t2; // float

http://www.boost.org/doc/libs/1_54_0/libs/mpl/doc/refmanual/vector.html

答案 1 :(得分:3)

loki中的类型列表就是这样做的。 Loki是由Andrei Alexandrescu设计和开发的图书馆。整个库是基于模板的。特别是,typelist(库的基本组件之一)为您提供了大量的编译时算法,允许您执行几乎所有要在列表上执行的操作(例如,通过索引访问,查找,删除重复项,。 ..)。类型列表本身非常简单:

template <class T, class U> 
struct Typelist 
{ 
 typedef T Head; 
 typedef U Tail; 

}; 
namespace TL 
{ 
 ...typelist algorithms ... 
}

它的力量来自它提供的算法。这些算法都是在编译时执行的。

TypleList工具在Modern C ++(Alexandrescu)一书中有详细描述

特别是,索引访问实现为:

template <class Head, class Tail> 
struct TypeAt<Typelist<Head, Tail>, 0> 
{ 
 typedef Head Result;
}; 
template <class Head, class Tail, unsigned int i> 
struct TypeAt<Typelist<Head, Tail>, i> 
{ 
 typedef typename TypeAt<Tail, i - 1>::Result Result; 
}; 

这样

TypeAt<MyList, 5>::Result a(...);

在MyList中创建一个名为“a”的第6个类型的对象。

答案 2 :(得分:3)

std::tuple已提供此功能。

std::tuple_element<1, std::tuple<int, float>>::type // float
std::tuple_element<0, std::tuple<int, float>>::type // int