2016-02-12 3 views
5

Есть ли способ получить шаблон от специализации шаблона? Например. std::unordered_map от переменной типа std::unordered_map<char, char>, которая будет передана в качестве параметра шаблона шаблона.Шаблон из шаблона специализации

Минимальный пример:

#include <unordered_map> 

template <template <class ...> class t_map> 
class A 
{ 
public: 
    typedef t_map <int, int> map_type; 
}; 

int main(int argc, char const **argv) 
{ 
    std::unordered_map<char, char> map; 

    // decltype yields std::unordered_map<char, char> (as expected). 
    typename A<decltype(map)>::map_type map_2; 
    return 0; 
} 
+0

Это зависит от того, что вы хотите сделать с шаблоном. В общем, вы можете передавать типы, но не шаблоны. Возможно, вы захотите заменить параметры шаблона. Можете ли вы дать больше контекста? – MarkusParker

+0

У меня есть пара классов, которые (ради полиморфизма) принимают параметр шаблона шаблона и делают из него специализацию. Классы обеспечивают минимальный интерфейс для контейнера типа карты. Один берет «std :: map», другой - «std :: vector» и реализует идеальное хеширование. Чтобы проверить ряд специализаций классов, было бы удобно написать функцию, которая будет принимать только контейнер модели (например, 'std :: map '), шаблон которого затем будет передан моему классу. – tsnorri

ответ

3

Вот пример того, как создать новый тип, где параметр шаблона (целое) обмениваются (строка):

#include <vector> 
#include <string> 

template <typename container, typename newt> 
struct replace; 

template <typename p1, typename alloc, template<typename,typename > class containerTemplate, typename newt> 
struct replace<containerTemplate<p1,alloc>,newt> { 
public: 
    typedef containerTemplate<newt,alloc> result; 
}; 

int main() { 
replace<std::vector<int>,std::string>::result vs; 
vs.push_back("a string"); 
} 

Таким образом, вы можете пройти станд :: unordered_map в качестве шаблона параметр для вашей функции и заменить символ любым другим типом, который вы хотите. Возможно, вам придется настроить свой пример на свои нужды. Но принцип должен быть ясным.

EDIT: Более общие для контейнеров, менее общий для замены:

template <class Container> 
struct replace; 

template <template <class...> class Container, class... Ts> 
struct replace<Container<Ts...>> { 
    typedef Container<std::string> result; 
}; 
+0

Ничего себе, ты это сделал. –

+0

'alloc', вероятно, следует отскочить и к новому типу. – Jarod42

0

Я не совсем уверен, это то, что вы ищете, но не Шаблонный псевдоним декларация вписывается в ваш пример?

#include <iostream> 
#include <map> 

template <typename T> 
using mm = std::map<T, T>; 

int main() 
{ 
    mm<int> i; 
    mm<char> c; 
} 
+0

К сожалению, нет, так как я хотел бы передать специализированную переменную функции шаблона и получить доступ к шаблону. – tsnorri

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