Vorrei sapere se è possibile filtrare i tipi passati a un modello variadic (basato su un modello di predicato) per produrre un altro modello variadic contenente quei tipi che soddisfano il predicato:Filtrare i tipi di un pacchetto di parametri
/** 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;
};
Come si può vedere, non ho trovato un modo per "estrarre" il pacchetto di parametri dal resto dei tipi filtrati.
Grazie in anticipo!
C'è qualcosa che non riesco ancora a capire, ma gli errori del compilatore non stanno aiutando. Ho postato qui http://ideone.com/USTnJR, se non ti dispiace dare un altro sguardo - non sembra corretto modificare l'originale. – scry
Quella versione ha avuto un altro problema, usa questo: http://ideone.com/eh3Epd. Come puoi vedere, i membri :: type di filter e Contro non sono riconosciuti come tipi. – scry
@roysc: 'Cons' dovrebbe essere specializzato per le tuple. Lasciami modificare questo. [Modifica:] Fatto. Ho anche modificato il modello principale per avere un caso base corretto. –