Salut,

J'ai un petit problème.
Pour simplifier des algorithmes, j'ai besoin d'utiliser des éléments d'un groupe cyclique.

Concrètement : symboliquement
( {1, e, e^2 } , * ) groupe cyclique.
1 est l'élément neutre, e est le générateur.
e^3 = 1
e^n = e*...*e (n fois)

Bien sûr en pratique j'utilise des int, et pas des 'e'.

Avant j'avais juste fait une classe template CyclicGroup, on instanciait un objet de cette classe, et on le construisait en injectant des éléments.

Après pour faire des opérations, j'passais des éléments en argument dans les méthodes de l'objet.

Seulement c'est chiant.

Exemple rédigé vite fait, commenté, puis discuté :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
// J'mets pas les constructeurs
 
template <class T>
class CyclicGroup
{
    vector<T> set;
 
public:
    void Add(const T & t); // Ajoute un élément, le premier élément est l'élément neutre, le second le générateur
    int Card(); // Cardinal du groupe
};
 
template <class T>
class CyclicElmt
{
    CyclicGroup<T> & G;
    T val;
 
public:
    void Bind(const CyclicGroup<T> & G_)
    {
        G = G_;
    }
 
    CyclicElmt<T> operator==(const CyclicElmt & e);
    CyclicElmt<T> operator=(const CyclicElmt & e);
    CyclicElmt<T> operator=(T t);
    CyclicElmt<T> operator*(const CyclicElmt & e);
    CyclicElmt<T> operator^(int i); // Attention à la priorité
    operator T();
};
 
// Utilisation
 
CyclicGroup<int> G;
G.Add(1);
G.Add(2);
G.Add(3);
 
CyclicElmt<int> a, b;
 
a.Bind(G);
b.Bind(G);
 
a = 1;
b = 2;
 
a = b^2;
La vous voyez, le principal problème c'est qu'il faut bind chaque élément séparément à son groupe.
Moi j'aimerais bien que ça soit fait à la déclaration de a et b.

En fait le must ce serait de ne meme pas préciser le type int, mais de passer en argument G quelque part, sauf que c'est pas possible pour les templates, ils prennent des types et pas d'instances.

Si vous avez des constructions mystiques qui seraient plus cools à utiliser les boss de la méta-programmation, merci d'avance .