是否存在类型的静态(编译器时间)向量?例如,我可以通过给定的常量整数索引获取类型,如下面的
Vector<int, float>::Type<0> is int
Vector<int, float>::Type<1> is float
答案 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