Bonjour

J'ai implémenté un systeme de conversions de grandeurs physiques (représentées en "double")
Je veux que les conversions se fassent autant que possible à la compilation.

voici l'implémentation actuelle (dans une en-tête):
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
50
51
class Converter {
public:
 
    constexpr Converter(double factor, double offset) :
        factor_(factor), offset_(offset) {}
 
 
    constexpr double toHuman(double siVal) const {
        return (siVal - offset_) / factor_;
    }
 
    constexpr double toSI(double humanVal) const {
        return humanVal * factor_ + offset_;
    }
 
private:
    double factor_;
    double offset_;
 
};
 
 
 
// converts to and from Pa
static Converter pressureHPa (100, 0);
static Converter pressurPSI (6894.75729 , 0);
 
// converts to and from m3
static Converter volumeL (1/1000.0, 0);
static Converter volumeML (1/1000000.0, 0);
static Converter volumeGal (0.00378541, 0);
 
// converts to and from m3/s
static Converter flowLPS (1/1000.0, 0);
static Converter flowLPM (1/60000.0, 0);
static Converter flowLPH (1/3600000.0, 0);
static Converter flowCCM (1/60000000.0, 0);
static Converter flowGPM (0.0000630901964, 0);
 
// converts to and from °K
static Converter tempC (1, 273.15);
static Converter tempF (5.0/9.0, 459.67);
 
// converts to and from s
static Converter timeM (60, 0);
static Converter timeH (3600, 0);
static Converter timeD (84600, 0);
 
// converts to and from kg
static Converter massLb (0.453592, 0);
static Converter massG (0.001, 0);
des variables statiques dans un en-tête ça ne me plait pas du tout, car l'allocation est faite dans toutes les unités de traduction.
Cependant déclarer ces variables "extern" va empecher la conversion en compiletime.

Idéalement j'aurais fait une classe template avec factor et offset passés en paramètres et les 2 fonctions statiques, mais on ne peut apparemment pas avoir de parametres autres que des entiers (j'ai besoin de double)

je pourrais m'inspirer de std::ratio, mais avec des valeurs comme 273.15, je suis bloqué.

Est-ce qqun connait un astuce ?
merci