c++ 如何返回Map到变量位置的类型

nhn9ugyo  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(144)

我很喜欢学习元编程,并开始了解一些特性,我不能调用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);
}
62lalag4

62lalag41#

如果我们将索引移到模板参数中,使其成为编译时常量,那么我们可以利用std::tuple_element来获取所提供索引处的类型,如

template<size_t Idx, typename... Ts>
auto at(type_list<Ts...>)
{
    return std::tuple_element_t<Idx, std::tuple<Ts...>>{};
}

然后我们可以称之为

at<2>(x);

应该注意,这种方法要求列表中的所有类型都是默认可构造的。
如果您只打算在decltype(at<2>(x))这样的上下文中使用at,那么实际上您不需要定义函数,而可以使用我称为“ meta函数”的函数,如

template<size_t Idx, typename... Ts>
auto at(type_list<Ts...>t) -> std::tuple_element_t<Idx, std::tuple<Ts...>>;

现在你不能运行这个函数,但是你可以在任何未赋值的上下文中使用它,比如decltype(at<2>(x)),列表中的类型不需要是默认可构造的。

相关问题