过滤参数包类型

问题描述 投票:0回答:1

我想知道是否可以过滤传递给可变参数模板(基于谓词模板)的类型,以生成另一个包含满足谓词的类型的可变参数模板:

/** Filter a parameter pack */    
template <template <class> class,
          template <class...> class,
          class...>
struct filter;
template <template <class> class Pred, template <class...> class Variadic>
struct filter<Pred, Variadic> : Variadic<>
{};
template <template <class> class Pred,
          template <class...> class Variadic,
          class T, class... Ts>
struct filter<Pred, Variadic, T, Ts...>
{
    // FIXME: this just stops at first T where Pred<T> is true
    using type = typename std::conditional<
        Pred<T>::value,
        Variadic<T, Ts...>,    // can't do: Variadic<T, filter<...>>
        filter<Pred, Variadic, Ts...> >::type;
};

如您所见,我还没有找到从其余过滤类型中“提取”参数包的方法。

提前致谢!

c++ c++11 metaprogramming variadic-templates
1个回答
9
投票

这应该是相当简单的。你内心应该有这样的东西:

template <typename...> struct filter;

template <> struct filter<> { using type = std::tuple<>; };

template <typename Head, typename ...Tail>
struct filter<Head, Tail...>
{
    using type = typename std::conditional<Predicate<Head>::value,
                               typename Cons<Head, typename filter<Tail...>::type>::type,
                               typename filter<Tail...>::type
                          >::type;
};

您只需要

Cons<T, Tuple>
,它将
T, std::tuple<Args...>
变成
std::tuple<T, Args...>
,并且您需要传递谓词(留作练习)。
Cons
可能看起来像这样:

template <typename, typename> struct Cons;

template <typename  T, typename ...Args>
struct Cons<T, std::tuple<Args...>>
{
    using type = std::tuple<T, Args...>;
};

filter<Args...>::type
的结果将是
std::tuple<Brgs...>
,其中
Brgs...
是仅由
Args...
中谓词成立的那些类型组成的包。

© www.soinside.com 2019 - 2024. All rights reserved.