8
votes

Paramètre de modèle C ++ dans la dimension de la matrice

J'ai le code suivant à l'aide de modèles et de dimensions de matrice en tant que paramètre de modèle non-type xxx

ne doit pas le compilateur à pouvoir instancier le deuxième paramètre de modèle explicite? J'utilise g ++ 4.1


3 commentaires

MSVC vous permettra de vous échapper avec un meurtre.


VC8 ne sera pas - au moins pas avec des paramètres sains :)


Je me trompais. MSVC vous permet de faire double (& c) [n] qui est évidemment, pas la même chose. Comeau est également cool avec double (& c) [n]. Incroyable la différence que quelques parens feront.


4 Réponses :


1
votes

Malheureusement non, car lorsque vous passez double c [5] à f () ou n'importe quel tableau à n'importe quelle fonction qui prend une matrice à ce sujet, vous perdez les informations de taille. Vous ne passez qu'un pointeur.

edit: mais voir la réponse de GF pour une solution de contournement.


2 commentaires

Votre commentaire, tandis que correct, n'est pas liée. True, au moment de l'exécution, il n'ya aucun moyen de déterminer la taille d'un tableau, mais la déduction du paramètre de modèle se produit au moment de la compilation. Le compilateur sait que la taille de la matrice est 5 et peut déduire le paramètre de modèle en conséquence, bien qu'il existe des limitations à ce sujet.


Il n'y a aucun moyen d'exécution pour déterminer le type déclaré original de Toute primitive . Vous perdez des informations lorsque vous le transmettez à une fonction qui attend un pointeur, mais vous le perdez de la même manière que vous perdez des informations lorsque vous passez un flotteur à une fonction qui s'attend à un entier. Pour être plus précis, le type de tableau au moment de la déclaration est "Array de 5 doubles" ou double [5]. Le type de matrice de taille a une forme implicite à un pointeur. Cette fonte est si courante que nous avons tendance à oublier que ce n'est pas le type d'origine du tableau, mais il est tout aussi valide comme un type d'autre.



0
votes

Non, car dans un appel différent, l'argument peut provenir de partout où. Le compilateur ne peut sûrement pas chasser vos pointeurs au moment de l'exécution .

Modifier: BTW, cela fonctionne pour moi, mais nécessite -std = C ++ 0x (J'utilise GCC 4.4) xxx


1 commentaires

Je demande spécifiquement à propos de l'affaire multidimensionnelle. Il y a des choses supplémentaires qui ne sont pas présentes dans le cas de la dimension unique. Il semble assez facile d'inférer "INTRA" mais "int ARR [N] [M]" est trop difficile.



30
votes

Cela fonctionne lorsque vous utilisez des références:

template<size_t n> double f(double (&c)[n]);


0 commentaires

-1
votes

Cela pourrait vous aider avec votre problème plus important (tout ce qui peut être). Cela vous permettra d'interroger la taille / type de la matrice à la compilation.

template < typename T_, unsigned N_ >
class many {
public:
    typedef T_ T;
    enum { N = N_ };

    T array[N];
};


1 commentaires

Hein? Comment cela aide-t-il?