2010-11-01 8 views
2

Vous pouvez utiliser des modèles pour trouver la longueur d'un tableau.Utilisation de modèles pour obtenir la taille et l'adresse de fin d'un tableau

template<typename T, size_t N> 
size_t arraylen(T(&)[N]) 
{ return N; } 

J'aimerais approfondir cette idée.

struct Foo 
{ 
    template< typename T, size_t N > 
    Foo(/* ??? */) : ptr(?), size(?) { } 

    char* ptr; 
    size_t size; 
}; 

int main() 
{ 
    Foo foo("test"); 

    const char bar[] = "test2"; 
    Foo foo2(bar); 

    const char* baz = bar; 
    Foo foo3(baz); // compiler error. 
} 

Cependant, pour la vie de moi je ne peux pas obtenir la syntaxe pour compiler. Je pense qu'une partie de ce qui me manque est que je ne comprends pas vraiment ce que le T(&)[N] signifie.

Que signifie T(&)[N]?

Comment puis-je autoriser l'accès à l'adresse de la baie tout en saisissant sa taille avec des modèles?

Répondre

6
struct Foo 
{ 
    template< typename T, size_t N > 
    Foo(T(&array)[N]) : ptr(array), size(N) { } 

    const char* ptr; 
    size_t size; 
}; 

array est une référence à un tableau de N T. La même chose est vraie pour le code original, mais le paramètre n'a pas de nom.

Mais cela ne calcule vraiment pas l'adresse au moment de la compilation. Si vous y réfléchissez, vous réaliserez que c'est impossible. Si les adresses de la pile étaient corrigées, la récursivité (et de nombreux autres algorithmes) ne pourrait jamais fonctionner.

Notez que la dernière ligne:

Foo foo3(baz); 

ne fonctionne toujours pas parce que baz est un pointeur pas un tableau.

+0

J'aurais dû changer le titre. Je n'ai pas mentionné le temps de compilation dans la question du tout. Je veux aussi que l'exemple 'baz' échoue. –