5.3 La classe qui décrit le Vecteur

Le fichier Vector.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef __Vector_H__
#define __Vector_H__

#include "PBaseExpressionTemplateClass.h"

class Vector :  public PExprGen<Vector> {
	public:
		Vector(size_t size, double w = 0) : p_size(size) {
			p_data = new double[p_size];
			for (size_t i(0); i < p_size; ++i) {
				p_data[i] = w;
			}
		}
		virtual ~Vector() {
			delete [] p_data;
		}
		double operator[] (size_t i) const {
			return p_data[i];
		}
		template <class A>
		void operator = (const PExprGen<A>& a_) {
			const A& a(a_);
			//on peut mettre un #pragma omp parallel et la boucle sera parallèlisée
			for (size_t i(0); i < p_size; ++i) {
				p_data[i] = a[i];
			}
		}
		
		template <class A>
		void operator += (const PExprGen<A>& a_) {
			const A& a(a_);
			for (size_t i(0); i < p_size; ++i) {
				p_data[i] += a[i];
			}
		}
	private:
		double * p_data;
		size_t p_size;
};

#endif

J'ai tout mis dans le .h, pour faire court, mais vous avez le droit de faire les choses proprement et de séparer les déclarations des implémentations.

La différence fondamentale par rapport à la méthode précédente, c'est que la classe que l'on veut utiliser avec les expressions templates doit hérité de la classe PExprGen. Dans les deux cas, il faut redéfinir l'opérateur = avec un PExprGen et l'opérateur [] pour renvoyer un élément d'un vecteur. Et l'opérateur = est void, ce qui change par rapport à la version précédente.