Salut!
Non, on ne peux pas ne pas préciser complètement la template utilisée sans être template du reste soi-même.
Il faut bien comprendre qu'une template n'est pas du code concret, et que StatusBar<1> n'est pas la même classe que StatusBar<5>.
Par contre, tu peux utiliser la déduction automatique de type, avec le mot-clé auto.
En effet, ce qui est important pour le développeur, ce n'est pas le type précis de la valeur, mais sa signification. Le compilateur connaît très bien son type, c'est son travail.
Selon la norme que tu utilises, il peut être nécessaire de préciser le "trailing type", voici la syntaxe:
- C++11: auto getStatusBar() -> decltype(m_bar) { return my_bar; }
- C++14: auto getStatusBar() { return my_bar; }
Je ne sais plus sous quelle condition il faut utiliser le trailing type, essaye sans le compilateur râlera s'il est nécessaire.
De même, dans init(), bar peut être définie par auto bar = getStatusBar(); ou auto const bar = getStatusBar();.
La règle est que auto est utilisable dans chaque définition où une valeur fournit le type à utiliser.
Ainsi, il n'est pas possible de déclarer une fonction retournant auto sans la définir immédiatement.
Cette astuce est également valable dans la définition de template.
template <typename A, typename B> auto add(A a, B b) { return a + b; }
D'un autre côté, je trouve dérangeant d'avoir un type template dans du code "métier".
Quand bien même ce serait le type adapté, je préfère de très loin avoir un alias de type portant un nom métier.
Le type que le métier manipule n'est pas StatusBar<5> mais le StatusBar-qui-va-bien, par exemple DetectorStatusBar.
En général, dans les applications que je manipule, j'ai visiblement trois couches de types:
- Les types purement techniques, définis par des templates.
- Les types auxiliaires du métier, souvent des capsules autour de templates comme vector, mais parfois des typedef vers ces types.
- Les types purement métier (ou logiques), non template, car la couche métier répond à un besoin précis.
La frontière entre les deux premières parties est parfois un peu floue, mais quoi qu'il advienne, si j'ai une valeur dont le type est une instance d'une template, je refuse qu'apparaisse son origine template dans le code qui s'en sert.
Partager