2016-11-30 5 views
1

Nous avons des cours largement utilisés qui enveloppent un std interne :: ListeComment puis-je prendre en charge la plage pour Statement pour une liste interne? (C++)

template <class COLL_TYPE> 
class OurColl 
{ 
... 
    private: 
    std::list<COLL_TYPE> *m_pList; 

Je voudrais être en mesure d'utiliser la gamme à base de boucles:

OurColl<int> listInts; 
for (int x : listInts) 
{ 

} 

Ce serait avoir à parcourir sur la m_pList sous-jacente.

Je pense que cette question est assez différente car elle est plus proche de la réponse fournie par Chris Redford au bas de la question marquée comme doublon.

En outre, il y a un peu de distorsion puisque je suis dans une classe avec un gabarit enveloppant une liste interne.

+0

S'il vous plaît excuser ma curiosité, mais pourquoi avez-vous un pointeur * * à une liste? Si vous n'avez pas de pointeur, vous pourriez vivre selon [la règle de zéro] (http://en.cppreference.com/w/cpp/language/rule_of_three#Rule_of_zero) qui fera votre vie (et la classe) plus simple. –

+0

Les parties importantes sont que vous avez besoin d'une fonction 'begin' et' end' qui retourne un objet qui est forwardable. C'est ce que les réponses dans les états dupliqués (d'une manière peut-être à long terme). La manière la plus simple de le faire dans ce cas est d'utiliser les itérateurs de listes enveloppées. –

+0

Mon code d'exemple semble-t-il correct? C'est un très vieux code qui est largement utilisé dans nos projets, j'espère en faciliter l'utilisation. – Derek

Répondre

0

Cela semble fonctionner:

typename std::list<COLL_TYPE>::iterator begin() 
    { 
     return m_pList->begin(); 
    } 
    typename std::list<COLL_TYPE>::iterator end() 
    { 
     return m_pList->end(); 
    } 
    typename std::list<COLL_TYPE>::const_iterator begin() const 
    { 
     return m_pList->begin(); 
    } 
    typename std::list<COLL_TYPE>::const_iterator end() const 
    { 
     return m_pList->end(); 
    }