J'ai une fonction foo
qui appelle une fonction bar
avec un sous-ensemble de types transmis au modèle variadique foo
. Par exemple:Exclure les n premiers arguments du pack de paramètres
template <typename... T>
void foo() {
// ...
template <size_t start_idx, typename... T>
using param_pack = /*Parameter pack with T[start_idx]...T[N]*/
auto b = bar<param_pack<2, T...>>();
// ...
}
Existe-t-il un moyen d'extraire un "pack de sous-paramètres". Dans le cas ci-dessus si T = [int float char double]
puis param_pack<2, T...> = [char double]
[EDIT]
Mon objectif est d'être en mesure d'utiliser quelque chose comme ça pour correspondre à des gestionnaires d'événements. Par exemple
struct ev {};
template <typename... T>
struct event : ev {
std::tuple<T...> data_;
event(T&&... d) : data_(std::make_tuple(std::forward<T>(d)...)) {}
};
template <typename... Functor>
struct handler {
std::tuple<Functor...> funcs_;
handler(Functor&&... f) : funcs_(std::make_tuple(std::forward<Functor>(f)...)) {}
void handle_message(ev* e) {
auto ptrs = std::make_tuple(
dynamic_cast<event<param_pack<1, typename function_traits<F>::args>>*>(e)...
);
match(ptrs);
}
};
Ici function_traits::args
obtenir un pack de paramètres pour les arguments de la fonction et itère match sur le tuple funcs_
vérifier si le dynamic_cast
a réussi et l'exécution de la première fonction avec succès. Je les ai déjà implémentés.
Les gestionnaires sont quelque chose comme
[] (handler* self, <ARGS>) -> void {
// ...
}
Je suis essentiellement en train de se débarrasser de l'argument self
.
Une question connexe: https://stackoverflow.com/questions/8569567/get-part-of-stdtuple – keith
Oops ... Mon mal ... Faire un modifier maintenant – subzero