0
votes

Comment puis-je dérouler un modèle variadique dans une condition?

Je cherche à dérouler un gabarit variable dans des fonctions distinctes utilisées dans la conjonction d'un si -Statement. Voici un exemple de ce que j'essaie de faire: xxx

mais cela me donne l'erreur:

Erreur C3520: args : le paquet de paramètres doit être étendu dans ce contexte

Je veux la ligne: si (bar (param) && ...) se dérouler sur: si (bar <0u> (param) && Bar <1u> (param) && bar <2u> (param)) y a-t-il une façon de le faire? Ou existe-t-il un adaptateur supplémentaire que je peux utiliser qui accomplira ceci?

Exemple live < / kbd>


2 commentaires

Utilisez un compilateur qui prend en charge le pliage?


@ Yakk-Adamnevraumont, donc dans le triste événement que le mien ne ... Puis-je faire quelque chose?


3 Réponses :


1
votes

Vous avez besoin d'un couple supplémentaire de parenthèses xxx

évidemment si votre compilateur prend en charge C ++ 17 (pliage de modèle).

Peut-être plus clair comme suit xxx


0 commentaires

2
votes

Si votre compilateur prend en charge C ++ 17's pli-expressions dont vous avez besoin Pour changer deux choses pour le faire fonctionner:

1.Changer l'ordre des paramètres de modèle dans bar de sorte que t peut être déduit lorsque i En termes explicitement spécifiés: xxx

2.Ajouter une paire de parenthèses à l'intérieur si puisqu'il s'agit d'une partie obligatoire d'une expression complexe: xxx

Exemple en direct


0 commentaires

1
votes

Donc, dans l'événement triste que le mien ne [Soutenez les expressions de pliage] em> ... Puis-je faire quelque chose? P>

Eh bien, si c'est vraiment le cas et que le problème n'était pas uniquement pour Oublier les parenthèses requises , alors vous pouvez aller Les modèles variadiques obligés doivent être manipulés avant C ++ 17: P>

template < typename T >
bool bar(T const& param) { return true; }

template <typename T, size_t I, size_t ... II>
bool bar(T const& param) { return param[I] != 13 && bar<T, II...>(param); }

template <typename T, size_t... ARGS>
void bar(T const& param, std::index_sequence<ARGS...> const&)
{
    if(bar<T, ARGS...>(param))
    {
        std::cout << "no matches\n";
    }
    else
    {
        std::cout << "matched\n";
    }
}


0 commentaires