132 votes

std :: ignore avec les liaisons structurées?

Prélude:

 std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();
 

C ++1z introduira une syntaxe pour les liaisons structurées qui permettra d’écrire au lieu de

 int a, b, c;
std::tie(a, b, c) = f();
 

quelque chose comme

 auto [a, b, c] = f();
 

Cependant, std::tie permettait également de spécifier std::ignore pour ignorer certains composants, par exemple:

 std::tie(a, b, std::ignore, c) = g();
 

Sera-t-il possible de faire quelque chose de similaire en utilisant la nouvelle syntaxe de liaisons structurées? Comment cela fonctionnerait-il?

90voto

metalfox Points 1255

Le structurée liaisons proposition contient une section dédiée pour répondre à votre question (P0144R2):

3.8 Devrait-il y avoir un moyen explicitement d'ignorer les composants?

La motivation serait de réduire au silence les avertissements du compilateur sur inutilisé noms. Nous pensons que la réponse devrait être "pas encore". Ce n'est pas motivée par des cas d'utilisation (faire taire les avertissements du compilateur est une motivation, mais il n'est pas un cas d'utilisation en soi), et il est meilleur à gauche jusqu'à ce que nous pouvons revoir tout cela dans le contexte plus général correspondant à un modèle où cette proposition devrait tomber comme un cas spécial.

D'une symétrie std::tie suggérons d'utiliser quelque chose comme un std::ignore:

tuple<T1,T2,T3> f();

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

Toutefois, cela se sent maladroit.

En anticipant pattern matching dans la langue pourraient faire penser à un générique comme _ ou *, mais depuis nous n'avons pas encore la correspondance de modèle, il est prématuré de chercher une syntaxe qui, nous le savons compatibles. C'est une pure extension qui peut attendre d'être considéré avec le pattern matching.

Notez, toutefois, que le projet de Norme est actuellement en cours de révision par les Instances Nationales compétentes (NB), et il y a un NB de commentaires demandant cette fonctionnalité (P0488R0, 100):

La décomposition déclarations doivent fournir la syntaxe se défausser de certaines valeurs de retour, tout comme std::tie utilise std::ignore.

12voto

Nicol Bolas Points 133791

Sera-t-il possible de faire quelque chose de similaire en utilisant la nouvelle syntaxe de liaisons structurées?

Non. Vous devrez juste créer un nom de variable qui ne sera pas mentionné plus tard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X