9

(述語テンプレートに基づいて) 可変個引数テンプレートに渡された型をフィルター処理して、述語を満たす型を含む別の可変個引数テンプレートを生成できるかどうかを知りたいです。

/** 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;
};

ご覧のとおり、フィルター処理された残りの型からパラメーター パックを "抽出" する方法が見つかりませんでした。

前もって感謝します!

4

1 に答える 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...

于 2013-08-21T19:54:37.783 に答える