簡體   English   中英

如何從另一個僅靜態選擇滿足某種類型規則的索引的元組實例創建一個元組實例?

[英]How can I create a tuple instance from another tuple instance that statically selects only indices that satisfy a certain type rule?

假設我有一個基本類型和一些派生類型:

struct base {};
struct d1 : base {};
struct d2 : base {};

假設我創建了一個元組,例如:

std::tuple<double, d1, d2, int> t(1.0, d1(), d2(), 1);

是否可以使用元/運行時編程來生成:

template<typename T>
using my_predicate = std::is_base_of<base, T>;

std::tuple<d1, d2> t_derived = filter(t, my_predicate);

我已經看過有關堆棧交換的答案,該答案可以讓我定義新類型,但是我還沒有弄清楚如何從原始元組中選擇運行時組件。 堆棧交換帖子在這里:

https://codereview.stackexchange.com/questions/115740/filtering-variadic-template-arguments

您可以使用以下內容:

template <typename TupleOfIntegralConstant>
struct as_sequence;

template <typename ... Ts>
struct as_sequence<std::tuple<Ts...>> {
    using type = std::index_sequence<Ts::value...>;
};

template <template <typename> class Pred, typename Tuple, typename Seq>
struct make_filtered_sequence;

template <template <typename> class Pred, typename Tuple, std::size_t ... Is>
struct make_filtered_sequence<Pred, Tuple, std::index_sequence<Is...>>
{
    using type = typename as_sequence<decltype(std::tuple_cat(
           std::conditional_t<
             Pred<std::tuple_element_t<Is, Tuple>>::value,
             std::tuple<std::integral_constant<std::size_t, Is>>,
             std::tuple<>>{}...))>::type;
};

template <typename Tuple, std::size_t ... Is>
auto filter_impl(const Tuple& t, std::index_sequence<Is...>)
-> std::tuple<std::tuple_element_t<Is, Tuple>...>
{
    return {std::get<Is>(t)...};
}

template <template <typename> class Pred, typename Tuple>
auto filter(const Tuple& t)
{
    using filtered_seq = typename make_filtered_sequence<Pred, Tuple, std::make_index_sequence<std::tuple_size<Tuple>::value>>::type;

    return filter_impl(t, filtered_seq());
}

想法是創建一個過濾后的序列,然后對該序列使用std::tuple_element_tstd::get

暫無
暫無

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

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