un paramètre de modèle peut être utilisé dans un autre paramètre de modèle qui suit ainsi:Comment utiliser un paramètre de modèle dans un autre paramètre de modèle déclaré avant
template<typename T, T N>
struct s
{
};
Mais est-il possible de faire référence à « T » si elle est déclaré après "N"?
Cela ne fonctionne pas:
template<T N, typename T>
struct s
{
};
Pouvons-nous aider le compilateur en pré-déclarant « T » ou faire autre chose?
Merci d'avance.
EDIT: comme les deux premières réponses demandaient "pourquoi êtes-vous prêt à faire cela?" Je vais vous expliquer l'objectif:
Je voudrais que le compilateur infère le type "T" afin de faciliter l'utilisation de classes modélisées.
Par exemple:
template<typename T, T A, T B>
struct sum
{
static T const value = A + B;
};
Ce modèle peut être utilisé de cette façon:
sum<int, 1, 2>::value
Mais ce serait mieux si elle pouvait être utilisé de cette façon:
sum<1, 2>::value
Techniquement il devrait être possible parce que le compilateur connaît les types de "1" et "2": "int", et en fait, il utilise ces inf ormations pour trouver la meilleure surcharge pour une fonction. Ainsi, en déclarant le modèle de cette façon:
template<T A, T B, typename T>
struct sum
{
static T const value = A + B;
};
le compilateur pourrait utiliser sa capacité de déduire le dernier paramètre à partir des informations fournies par le premier et le second, puis trouver le meilleur modèle pour instancier.
Merci pour la réponse: si la norme dit non, c'est non. La question est maintenant: pourquoi ce comportement limité alors qu'il semble possible de faire cette déduction? Avez-vous quelques exemples justifiant cette décision? Merci. – Pragmateek
Parce que la métaprogrammation de modèle n'a jamais été conçue pour être expressive? :) Question intéressante, cependant. Peut-être vous devriez vérifier si cela a été proposé, ou faire cette proposition pour C++ 1x. – UncleBens