这是在做你想做的事吗?它使用 C++11 特性,即可变参数模板。该index_of
结构返回类型列表中类型的索引,如果类型列表不包含给定类型,则返回 -1。它是一个在 type_list 类中使用的辅助结构。type_list 类获取类列表并提供子类模板tag
,该模板通过使用类模板提供对列表中各个类型的索引的访问index_of
。
template <int, class...>
struct index_of;
template <int n, class type, class first, class ... types>
struct index_of<n, type, first, types...>
{
static constexpr int value = index_of<n+1, type, types...>::value;
};
template <int n, class type, class ... types>
struct index_of<n, type, type, types...>
{
static constexpr int value = n;
};
template <int n, class type>
struct index_of<n, type>
{
static constexpr int value = -1;
};
template <class ... types>
struct type_list
{
template <class type>
struct tag
{
static constexpr int value = index_of<0, type, types...>::value;
};
};
用法:
using my_list = type_list<int, float, double>;
std::cout << "Tag of int: " << my_list::tag<int>::value << std::endl;