2012-01-07 3 views
1

Следующий код работает, если я ручной обратный порядок аргументов шаблона, который передается ему:переборе аргументы VARIADIC шаблона в обратном порядке

template<typename HeadTag, typename... TailTag> 
struct Mapped_scope_deep : public Mapped_scope_deep<TailTag...> { 
    typedef typename boost::mpl::at<typename Mapped_scope_deep<TailTag...>::type::type_map, 
            HeadTag>::type type; 
}; 

template<typename HeadTag> 
struct Mapped_scope_deep<HeadTag> { 
    typedef typename boost::mpl::at<type_map, HeadTag>::type type; 
}; 

Пример:

// typename Mapped_scope_deep<T0, T1, T2, T3>::type 
// needs to be written as 
typename Mapped_scope_deep<T3, T2, T1, T0>::type 

я пытался чтобы исправить это здесь:

template<typename map, typename HeadTag, typename... TailTag> 
struct Mapped_scope_deep_r : 
    public Mapped_scope_deep_r< typename boost::mpl::at<map, HeadTag>::type::type_map, TailTag...> { 
    typename Mapped_scope_deep_r< typename boost::mpl::at<map, HeadTag>::type::type_map, TailTag...>::type type; 
}; 

template<typename map, typename HeadTag> 
struct Mapped_scope_deep_r<map, HeadTag> { 
    typedef typename boost::mpl::at<map, HeadTag>::type type; 
}; 

template<typename... Tags> 
struct Mapped_scope_deep3 : 
    public Mapped_scope_deep_r<type_map, Tags...> { 
    typedef typename Mapped_scope_deep_r<type_map, Tags...>::type type; 
}; 

Пример:

typename Mapped_scope_deep<T0, T1, T2, T3>::type 

Но это заканчивается ошибкой компиляции:

./compressed_enums.hxx:197:66: error: typename specifier refers to non-type member 'type' in 'Gamblify::Asdf<unsigned char, CAT>::Mapped_scope_deep_r<boost::mpl::map<boost::mpl::pair<Cat, Gamblify::Category2<unsigned char, 1, Cat, B_First, TagA_array_2, B_Second> > >, Cat, First>' 
    typedef typename Mapped_scope_deep_r<type_map, Tags...>::type type; 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~ 

Что я сделал не так, и это их простой способ сбросить подобные операции в обратном порядке?

ответ

0

Вам не хватает typedef в Mapped_scope_deep_r. Эта строка объявляет объект, а не тип:

typename Mapped_scope_deep_r< typename boost::mpl::at<map, HeadTag>::type::type_map, TailTag...>::type type; 

Что касается изменений порядка пачки, есть некоторые грязные трюки, но лучший способ определить metafunction tuple_reverse и использовать его для фильтрации ввода шаблона ,

Смежные вопросы