2010-10-29 4 views
3

Étant donné le code ci-dessous, y a-t-il une meilleure façon de le corriger qui ne répète pas deux fois typename std::iterator_traits<T>::iterator_category?Ne pas répéter les types utilisés comme paramètres de gabarit

template<class T, class T2> 
struct foo : 
    bar< 
     foo<T, T2>, typename 
     std::conditional< 
      std::is_same<typename 
       std::iterator_traits<T>::iterator_category, //Repeated 
       std::random_access_iterator_tag 
      >::value, 
      std::bidirectional_iterator_tag, typename 
      std::iterator_traits<T>::iterator_category  //Repeated 
     >::type 
    > 
{} 

Répondre

3

le diviser (comme il devrait être de toute façon):

// put in detail namespace/file or something in real code 
template<class T, class T2> 
struct foo_base 
{ 
    typedef foo<T, T2> foo_type; 
    typedef typename std::iterator_traits<T>::iterator_category category_type; 

    static const bool random_access = std::is_same<category_type, 
             std::random_access_iterator_tag>::value; 
    typedef typename std::conditional<random_access, 
             std::bidirectional_iterator_tag, 
             category_type>::type tag_type; 

    typedef bar<foo_type, tag_type>::type base_type; 
} 

template<class T, class T2> 
struct foo : 
    foo_base<T, T2>::base_type 
{}; 

Même s'il n'y avait pas peu répété, vous devriez toujours diviser pour garder la logique du type de base séparée de l'héritage du type de base.

+0

Merci. Cela semble tellement évident rétrospectivement. – Jon

+0

@Jon: Heureusement, il suffit de l'apprendre une fois. :) – GManNickG

0

Vous pouvez typedef il:

typedef std::iterator_traits<T>::iterator_category it_cat; 
+2

Est-ce compilable? Où proposez-vous de mettre ce code? Notez que 'T' est un paramètre de modèle. – Vlad

+0

@Vlad, pouvons-nous dire: typedef std :: iterator_traits :: iterator_category it_cat; – Sheen

+0

@Sheen: Cela n'a pas de sens. Vous avez toujours besoin d'un emplacement pour placer le 'typedef' entre la liste de classe' foo' et la classe de base. – GManNickG

Questions connexes