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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #ifndef MATHOPS_HPP
#define MATHOPS_HPP
// ------------------------------- Déclaration des structures -------------------------------
struct opAdd; // Addition
struct opSub; // Division
// --------------------------- Définition de la classe Expression ---------------------------
template <typename L, typename OpTag, typename R>
struct Expression
{
// Constructeur / Destructeur
Expression (const L &, const R &);
~Expression ();
// Surcharge de l'opérateur []. Permet l'évaluation de l'expression template
inline float operator[] (const size_t) const;
private:
const L & l; // Opérande gauche
const R & r; // Opérande droite
};
// Constructeur
template <typename L, typename OpTag, typename R>
Expression <L, OpTag, R>::Expression (const L & l, const R & r)
: l (l), r (r)
{
}
// Destructeur
template <typename L, typename OpTag, typename R>
Expression <L, OpTag, R>::~Expression ()
{
}
// Surcharge de l'opérateur []. Permet l'évaluation de l'expression template
template <typename L, typename OpTag, typename R>
inline float Expression <L, OpTag, R>::operator[] (const size_t idx) const
{
return OpTag::Compute (l[idx], r[idx]);
}
// ------------------------ Définition des structures mathématiques ------------------------
// Addition
struct opAdd
{
// Unique fonction de la structure. Se contente de renvoyer la somme de ses deux paramètres
static float Compute (const float a, const float b)
{
return a+b;
}
};
// -------------------------------- Surcharge des opérateurs --------------------------------
// Opérateur d'addition (+)
template <typename L, typename R>
Expression <L, opAdd, R> operator+ (const L & l, const R & r)
{
return Expression <L, opAdd, R> (l, r);
}
#endif // MATHOPS_HPP |
Partager