6
バリデーションテンプレートに渡されるタイプを(述語テンプレートに基づいて)フィルタリングして、述語を満たすタイプを含む別のバリデージテンプレートを生成することができるかどうかを知りたいと思います。パラメータパックのタイプをフィルタリングする
/** 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;
};
ご覧のとおり、残りのフィルタリングされたタイプからパラメータパックを「抽出する」方法が見つかりませんでした。
ありがとうございます!
私はまだ理解していないことがありますが、コンパイラのエラーは役に立ちません。私はここでhttp://ideone.com/USTnJRを投稿しました。もしあなたがもう一度見ても構わないのであれば、オリジナルを編集するのは適切ではないようです。 – scry
そのバージョンには別の問題がありました。このバージョンはhttp://ideone.com/eh3Epdです。ご覧のように、filterとConsの:: typeメンバは型として認識されません。 – scry
@roysc: 'Cons'はタプルに特化する必要があります。私はこれを編集させてください。 [編集:]完了。私はまた、適切な基本ケースを持つためにメインテンプレートを修正しました。 –