簡體   English   中英

如何通過索引獲取列表類型的元素

[英]How to get an element of type list by index

如何通過索引檢索using L = type_list<T1, T2, ...>的類型列表的元素,例如std::tuple_element ,最好以非遞歸方式?

我想避免將元組用作用例的類型列表,這些用例需要實例化以傳遞像f(L{})這樣的列表。

template<typename...> struct type_list {};
using L = typelist<int, char, float, double>;
using T = typeAt<2, L>; // possible use case

不確定使用std::index_sequence迭代和通過std std::integral_constant版本的索引的 std::is_same 的測試是否是一個好的方法。

我想避免將元組用作用例的類型列表,這需要實例化以傳遞像f(L{})這樣的列表

如果您不想實例化std::tuple但您可以在未評估的上下文中使用它,您可以利用std::tuple_element來實現您的typeAt特征:

template <std::size_t I, typename T>
struct typeAt;

template <std::size_t I, typename... Args>
struct typeAt<I, type_list<Args...>> : std::tuple_element<I, std::tuple<Args...>> {};
                                    // ^ let library authors do the work for you

using L = type_list<int, char, float, double>;
using T = typename typeAt<2, L>::type;

static_assert(std::is_same<T, float>::value, "");

使用Boost.Mp11 ,這是一個單行(一如既往):

template<typename...> struct type_list {};
using L = typelist<int, char, float, double>;
using T = mp_at_c<L, 2>; // <==

請注意,這將比使用tuple_element更有效地編譯。 在 clang 上,實現甚至使用編譯器內在函數。

如果您不想使用std::tuple ,則可以重新實現簡化的非遞歸類元組版本:

template <std::size_t I, typename T>
struct type_list_leaf
{
    using type = T;
};

template <typename T> struct tag{ using type = T; };

template <typename Seq, typename...>
struct type_list_impl;

template <std::size_t... Is, typename... Ts>
struct type_list_impl<std::index_sequence<Is...>, Ts...> : type_list_leaf<Is, Ts>...
{
};

template <std::size_t I, typename T>
tag<T> type_list_element_tag(const type_list_leaf<I, T>&);

template <std::size_t I, typename Tuple>
using tuple_element = decltype(type_list_element_tag<I>(std::declval<Tuple>()));

template <std::size_t I, typename Tuple>
using tuple_element_t = typename tuple_element<I, Tuple>::type;

template <typename ... Ts>
using type_list = type_list_impl<std::make_index_sequence<sizeof...(Ts)>, Ts...>;

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM