Quand un compilateur peut déduire un paramètre de modèle?
Parfois cela fonctionne, parfois pas:
template <class T>
void f(T t) {}
template <class T>
class MyClass {
public:
MyClass(T t) {}
};
void test () {
f<int>(5);
MyClass<int> mc(5);
f(5);
MyClass mc(5); //this doesn't work
}
Est-il un moyen de pirater autour de l'exemple ci-dessus? I. e. forcer le compilateur à déduire le paramètre de modèle de paramètre du constructeur.
Ce que ce sera corrigé dans le futur, ou est-il une bonne raison de ne pas?
Ce qui est la règle générale, lorsque le compilateur peut déduire paramètre de modèle?
Vous devez vous connecter pour publier un commentaire.
Paramètres du modèle peuvent être déduites pour les modèles de fonction lorsque le type de paramètre peuvent être déduites à partir des paramètres du modèle
De sorte qu'il peut être déduit ici:
mais pas ici:
Et pas dans modèles de classe.
Donc l'habituel solution à votre problème est de créer une fonction wrapper, similaire à la fonction de la bibliothèque standard
std::make_pair
:et ensuite appeler
auto a = MakeMyClass(5);
pour instancier la classe.Lire sur Argument De Modèle Déduction (et ADL ou Koenig recherche).
En C++17, il est possible de déduire certains types à l'aide de
auto
, bien que les paramètres du modèle doivent encore être précisées ici:À l'aide de la -fconcepts drapeau du ccag, il est possible de déduire les paramètres, si ce n'est pas encore une partie de la norme C++: