我很喜欢学习元编程,并开始了解一些特性,我不能调用at works,它需要一个索引来返回Map到变量位置的类型。
#include <iostream>
#include <type_traits>
#include <utility>
template <typename...>
struct type_list {};
template<typename T ,typename... Ns>
auto pop_front(type_list<T, Ns...> t) {
return type_list<Ns...>{};
}
template<typename T ,typename... Ns>
auto front(type_list<T, Ns...> t)
{
return type_list<T>{};
}
template<typename T ,typename... Ns>
auto at(type_list<T, Ns...> t, size_t i)
{
if (i) return at(pop_front(t), i-1);
return front(t);
}
int main()
{
type_list<int, bool, float> x;
at(x,2);
}
1条答案
按热度按时间62lalag41#
如果我们将索引移到模板参数中,使其成为编译时常量,那么我们可以利用
std::tuple_element
来获取所提供索引处的类型,如然后我们可以称之为
应该注意,这种方法要求列表中的所有类型都是默认可构造的。
如果您只打算在
decltype(at<2>(x))
这样的上下文中使用at
,那么实际上您不需要定义函数,而可以使用我称为“ meta函数”的函数,如现在你不能运行这个函数,但是你可以在任何未赋值的上下文中使用它,比如
decltype(at<2>(x))
,列表中的类型不需要是默认可构造的。