2011-05-31 11 views
2

J'essaie de me familiariser avec les modèles C++. Je dois écrire un modèle de fonction qui concatène 2 tableaux:Comment concaténer 2 tableaux basés sur des modèles?

template<typename T, int Size> 
class Array 
{ 
public: 
    void push(int i, const T& t) { _elem[i] = t; } 
private: 
    T _elem[Size]; 
}; 

Par exemple, j'ai 2 tableaux:

Array<int,3> a1; 
Array<int,4> a2; 

Je ne sais pas comment écrire cette fonction, qui retourne

Array<int,7>. 

À quoi devrait ressembler l'en-tête de cette fonction?

Répondre

2

Vous devriez l'essayer comme ceci:

template<typename T, int A, int B> 
Array<T, A+B> concatenate(Array<T, A> first, Array<T, B> second) 
{ 
    Array<T, A+B> result; 
    for (int idx = 0; idx < A; ++idx) { 
     result.push(idx, first[idx]); 
    } 
    for (int idx = 0; idx < B; ++idx) { 
     result.push(idx+A, second[idx]); 
    } 
    return result; 
} 
+0

Je ne suis pas sûr de savoir à quoi servent ces 'typename'. – GManNickG

+0

ajouté un opérateur [] à votre tableau pour accéder aux éléments via le premier [idx] ... – duselbaer

+0

@duselbaer, le type de retour et les deux types d'entrée sont différents, donc vous auriez besoin de modéliser la fonction permettant le type T et deux tailles. – juanchopanza

1

Vous pouvez le faire comme ça, comme une fonction libre en dehors de la classe:

template <typename T, int SizeA, int SizeB> 
Array<T, SizeA + SizeB> join(const Array<T, SizeA>& first, 
           const Array<T, SizeB>& second) 
{ 
    /* ... */ 
} 

Pour ce que ça vaut la peine, vous devriez probablement utiliser std::size_t de <cstddef> au lieu de int.

Questions connexes