2016-02-08 2 views
0

У меня есть класс шаблонов, который в основном реализует шаблон оформления реестра. значения регистрируются с ключами и хранятся в каком-то контейнере:Как переключиться на typedef из шаблона aliasing?

template <typename Key, typename Value, 
    template <typename...> class Container > 
class registry 
{ 
public: 
    typedef Key key_type; 
    typedef Value value_type; 


    typedef std::pair<key_type, value_type> element_type; 
    typedef Container<element_type> container_type; 

Тогда я могу использовать его с контейнерами последовательности, как это:

registry<const char*,void*, std::list> r1; 
registry<const char*,void*, std::vector> r2; 

Я могу даже использовать его с псевдонимом:

template <typename T> 
using alias_container = std::array<T, 10>; 

registry<const char*,void*, alias_container > r4; 

Но я не могу понять, как использовать его с ЬурейиМи так:

template <typename T> 
class my_container2 
{ 
    typedef std::array<T,3> type; 
}; 

Я в принципе хочу что-то вроде этого:

registry<const char*,void*, my_container2::type > r5; 

Большое спасибо за вашу помощь.

+0

Я не думаю, что вы можете это сделать. Типед не является шаблоном. – rici

ответ

2

type зависит от типа шаблона, предоставленного для my_container2. Для того, чтобы использовать его необходимо указать параметр шаблона, как

registry<const char*,void*, my_container2<some_type>::type > r4; 
              ^^^^^^^^^ template type here 

Это то же самое понятие, как итераторы для стандартных типов. Вы не можете использовать container_type::iterator. Вы должны использовать container_type<some_type>::iterator.

+0

Натан, спасибо за ваш ответ. В моем случае будет вычитаться по шаблону реестра: он должен быть std :: pair , но я бы предпочел воздержаться от явного указания его. –

+0

@YakovGerlovin - Вы не можете делать то, что хотите. Нет такой вещи, как шаблон typedef. Авторы C++ исследовали это и обнаружили множество проблем. Вместо этого они добавили концепцию сглаженных шаблонов, которые используют 'using alias_name = some_type_possibly_templated;'. –