J'ai lu sur le système de modèle dans la langue D et est venu sur une construction inhabituelle, De ce que j'ai réussi à saisir, il est évalué à l'heure de la compilation, mais d'après ce que j'ai cherché, l'exemple montré ici a > Ne m'éclaircit pas vraiment. p> Qu'est-ce que statique si code>.
statique si code> faire et quand dois-je l'utiliser? p> p>
4 Réponses :
Le d depuis D ne pas t avoir un préprocesseur, des choses comme p> peuvent devenir p> De même, la métaprogrammation peut également se produire via statique si: < / p> peut être p> statique si code> est la base de "compilation conditionnelle" et joue un rôle important partout où une décision de temps de compilation concernant une variante d'un code doit être prise.
Merci. Je pense que ce qui me confondait était la fonction comme l'utilisation.
D'ailleurs. Premier exemple ne compilera pas. Pour cela d a la version (xxx) {} else {} code>
Cela dépend de ce que XXX est réellement: s'il s'agit d'un symbole, la version est la déclaration, s'il s'agit d'une expression constante static_if fonctionne. Le bon exemple n'est probablement pas #Ifdef ... code> mais
#if .... code>
Alors pourquoi ne le change-tu pas dans votre réponse?
L'exemple Wikipedia est en fait assez simple: C'est un modèle éponyme (voir le commentaire de Jonathan ci-dessous). ? - Ça ne marchera pas. Vérifiez http://dpaste.dzfl.pl/3fe074f2 . La raison est que le fait que statique si et "normal" si avoir une sémantique différente. Si vous souhaitez utiliser statique si pour cela, vous écririez quelque chose comme: < / p> n code> est le paramètre Modèle. Donc, si vous écrivez si vous écrivez: p>
statique si code> prend une expression d'affectation ( http://dlang.org/version.htmlled/version.htmlled/version ./ a>, section "statique si") qui est évaluée à l'heure de compilation em>, tandis que la normale si elle prend une expression qui est évaluée à l'exécution. p>
statique si / code> est juste un moyen de faire la "compilation conditionnelle" mentionnée par Emilio. D A également le mot-clé
version code>. Donc, le premier exemple de compilation conditionnelle d'Emilio (qui ne fonctionne pas dans d) devient quelque chose comme: p>
Factorial n'est pas une fonction de modèle. C'est un modèle éponyme. Les utilisations du gabarit sont remplacées par le résultat du gabarit qui est le symbole à l'intérieur du modèle avec le même nom que le modèle - E.G. Factorial! 5 code> devient
120 code>. C'est entièrement une construction de temps compilée. Ceci est complètement différent d'une fonction modélisée qui s'appelle toute autre fonction mais est instanciée avec différemment en fonction des types de ses arguments. Basé sur votre réponse, je suppose que vous le comprenez et que vous avez juste la terminologie erronée, mais vous allez causer de la confusion telle quelle.
Correct. :) Je vais mettre à jour ma réponse afin que la terminologie ait raison.
Andrei Alexandrescu a une bonne conversation que vous pouvez regarder ici à propos de statique si dans un contexte C ++ (si c'est ce que vous demandez). P>
Link: http: // canal9.msdn.com/events/ingnative/ingnative-2012/static-if-i-had-a-hammer P>
réponse courte - il rend la syntaxe pour certains modèles métaprogrammant beaucoup plus intuitives. P>
Walter a également touché statique si code> dans l'une de ses présentations, j'ai juste oublié lequel ... :)
Andrei Alexandrescu a récemment appelé l'utilisation intelligente de Un exemple direct de sa conversation mettrait en œuvre un conteneur générique tel qu'une table de hachage utilisant Robin Hood hachage, où une donnée supplémentaire (nombre de sonde) est conservée à chaque entrée de la table. Avec paraphrasé de la conversation : p> statique si code> "conception par introspection", avec quelques excellents exemples ( vidéo , Diapositives ) .
statique si code> Nous pouvons optimiser la mémoire automatiquement en plaçant le nombre de sonde à côté de la touche en fonction de son alignement, optimisez la largeur d'entier pour le type d'index, etc. P>
n'a pas reçu ce que vous attendez réellement, s'il vous plaît élaborer le problème
@R. Martinho Fernandes de ce que je sais que ceci est conçu comme une superseed de C ++
@ aravind.udayashankara Je ne comprends pas vraiment ce que la statique est-elle.
@Coredump Si vous voulez dire "superset", alors non. D est nulle part près d'un superset de C ++.
@Coredump: Pas exactement. D n'est pas un surseed de C ++. Les deux c ++ et D sont dépassés de C (dans le sens qui permettent de lier les fonctions C et de prendre en charge le même modèle d'expression) avec une compatibilité introductible différente de c
C'est discutable. Je serais en fait accepter d'étendre. Nom Une fonction de langue C ++ que D n'a pas. Je peux, d'autre part, énumérer quelques fonctionnalités D que c ++ n'a pas (et n'aura probablement jamais).
Alors que si @Coredump signifie " Supersede ", alors nous ne pouvons que rêver de la journée ...