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é :
La vous voyez, le principal problème c'est qu'il faut bind chaque élément séparément à son groupe.
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;
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.
Partager