Si je suis autorisé à faire ce qui suit:
template <typename T = int>
class Foo{
};
Pourquoi ne suis-je pas autorisé à faire ce qui suit en général?
Foo me;
Mais je dois préciser ce qui suit:
Foo<int> me;
C ++ 11 a introduit des arguments de modèle par défaut et pour le moment, ils sont insaisissables pour ma compréhension complète.
Foo
peut - être un identificateur de modèle ou peut - être une instanciation explicite selon que il y a un argument par défaut. Mieux vaut conserver la syntaxe d'instanciation explicite. Pensez-y comme une fonctionfoo
avec un seul paramètre par défaut. Vous ne pouvez pas l'appeler commefoo
, vous l'appelez avecfoo()
. Il est logique de garder cela cohérent.foo
ou l'autre; vous pouvez cependant nommer une classe sans argumentFoo
.<>
n'est plus nécessaire dans ce cas. Consultez ma réponse pour plus de détails.Avec C ++ 17, vous pouvez en effet.
Cette fonctionnalité est appelée déduction d'argument de modèle de classe et ajoute plus de flexibilité à la façon dont vous pouvez déclarer des variables de types modèles .
Alors,
est maintenant du code C ++ légal .
la source
Vous n'êtes pas autorisé à faire cela mais vous pouvez le faire
puis fais
la source
typedef Foo<float> Fooo;
sans un type par défaut?using Fooo = Foo<>;
Vous pouvez utiliser les éléments suivants:
Et
int
soyez votre argument modèle. Les crochets angulaires sont nécessaires et ne peuvent pas être omis.la source