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_);
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.
|