J'ai découvert qu'il n'est pas trivial d'avoir une syntaxe soignée comme dans :
std::function<int(float, bool)>
Si je déclare la fonction comme :
template <class RetType, class... Args>
class function {};
Il s'agirait d'une syntaxe ordinaire pour définir les types de fonctions modélisés :
function<int,float,bool> f;
Mais cela fonctionne avec une astuce étrange, à savoir la spécialisation partielle des modèles.
template <class> class function; // #1
template <class RV, class... Args>
class function<RV(Args...)> {} // #2
Comment cela se fait-il ? Pourquoi je dois donner au modèle une forme générale vide avec un paramètre de type vide (#1) ou sinon il ne compilera pas.