2015-10-17 5 views
1

J'écris une petite bibliothèque pour la mécanique quantique et je veux utiliser un modèle d'expression pour former des expressions d'opérateur. Surtout en formant le hamiltonien avec le modèle d'expression.Modèle d'expression et symbole de sommation

Je essentiellement suivi cette source pour construire le code et la surcharge des opérateurs correspondants + * -: https://en.wikipedia.org/wiki/Expression_templates

Formage l'expression de l'hamiltonien exige une somme

Vec x = u_1 + u_2 + ... + u_N 

où N est un (const) entier et u_i sont aussi de type Vec. L'écriture de cette expression dans le code fonctionne mais je voudrais pouvoir écrire

Vec x = Sum_{i=0}^{N} u_i 

Comment ferait-on cela?

------------ ------------ EDIT

Après quelques recherches et avec l'aide des commentaires, je suis venu avec une idée de statique pour la boucle ... Après googling j'ai trouvé un article dans http://www.drdobbs.com/loops-metaloops-c/184401835?pgno=8 qui est exactement ce dont j'avais besoin.

+0

Demandez-vous comment écrire une fonction pour effectuer une somme en utilisant vos expressions? –

+0

Oui, c'est exactement ma question. – user2460530

+0

Alors, posez la question. Ceci est un site Q & A. – juanchopanza

Répondre

0

Il n'existe aucun moyen d'écrire un modèle ou une fonction qui correspond magiquement à des variables de la portée environnante, donc votre syntaxe u_i ne peut pas fonctionner. Vous pourriez faire quelque chose de similaire avec une macro, .: par exemple

#define SUM_4(x) x ## 1 + x ## 2 + x ## 3 + x ## 4 

Utilisation:

Vec u_1, u_2, u_3, u_4; 
... 
Vec x = SUM_4(u_); 

Vous auriez besoin de définir des macros supplémentaires pour d'autres numéros de vecteurs de source.

L'opérateur d'indice dans C++ est modélisé par l'accès au tableau, par ex. u[1], u[2], .... Si vous souhaitez conserver un tableau de Vec, vous pouvez écrire une fonction générique qui itère sur le tableau. Dans ce cas, le paramètre serait le tableau. Quelque chose comme:

template<typename T, int N> 
T sum(T (&u)[N]) 
{ 
    // (or your preferred summation procedure) 
    T x = u[0]; 
    for (int i=1; i < N; ++i) 
     x += u[i]; 
    return x; 
} 

Utilisation:

Vec u[4]; 
... 
Vec x = sum(u); 

Mieux encore utiliser un modèle de tableau de taille fixe ou std::vector.

P.S. Envisagez d'utiliser Eigen.

EDIT: Mise à jour modèle sum() avec déduction de la taille du tableau de http://www.cplusplus.com/articles/D4SGz8AR/

+0

Pourquoi ne pas laisser le compilateur en déduire N? –

+0

@ MarkGlisse, parce que je ne savais pas comment faire ça. Mais maintenant je le fais. Fixé. –

+0

Merci beaucoup pour votre réponse. Je ne suis pas totalement sûr de comprendre cependant. Dans votre façon de somme, puisque le type T est Vec alors l'opérateur + = devrait retourner quelque chose comme VecAjouter , n'est-ce pas? (Voir https://en.wikipedia.org/wiki/Expression_templates). Par conséquent, je comprends que les opérations telles que x + = u [i]; ne sont pas possibles? – user2460530