Comme on peut s'en douter, le code ci-dessous ne compile pas (GCC 6.2.1 mais peu importe je pense) : le compilateur ne parvient pas à inférer le premier paramètre T. En précisant float ligne 17, ça passe crème.

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
// normalizes an interpolation parameter prior to forwarding it
template <typename T, T (*Func)(const T&)>
inline
T normalizeParams(const T& t, const T& start, const T& end) {
    const T range(end - start);
    return start + Func((t - start) / range) * range;
}
 
// expects a normalized parameter
template <typename T>
inline
T easeIn(const T& t) {
    return t * t * t;
}
 
int main() {
    float a(normalizeParams</*float, */easeIn>(2.24f, .846f, 3.451f));
    return int(a);
}
Oui mais bon, avoir à préciser T n'est pas satisfaisant. Or Func en dépend. Y aurait-il un moyen de donner un coup de pouce au compilo ?