2016-02-12 14 views
5

Czy istnieje sposób na uzyskanie szablonu ze specjalizacji szablonu? Na przykład. std::unordered_map ze zmiennej typu std::unordered_map<char, char>, która ma być przekazana jako parametr szablonu szablonu.Szablon ze specjalizacji szablonów

Minimal przykład:

#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

To zależy od tego, co chcesz zrobić z szablonu. Ogólnie można przekazywać typy, ale nie szablony. Możliwe, że możesz zastąpić parametry szablonu. Czy możesz podać więcej kontekstu? – MarkusParker

+0

Mam kilka klas, które (ze względu na polimorfizm) podjąć parametr szablonu szablonu i dokonać z niego specjalizacji. Klasy zapewniają minimalny interfejs do kontenera mapowego. Jeden bierze 'std :: map', inny' std :: vector' i implementuje doskonałe hashowanie. Aby przetestować wiele specjalizacji klas, wygodnie byłoby napisać funkcję, która pobierałaby tylko kontener modelu (np. 'Std :: map '), którego szablon zostałby następnie przekazany do mojej klasy. – tsnorri

Odpowiedz

3

Oto przykład, w jaki sposób utworzyć nowy typ gdzie parametr szablonu (int) są wymieniane (przez String):

#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"); 
} 

ten sposób można przekazać std :: unordered_map jako szablon parametr do funkcji i zastąp char dowolnym innym typem. Być może będziesz musiał dostosować mój przykład do swoich potrzeb. Ale zasada powinna być jasna.

EDIT: bardziej ogólne dla pojemników, mniej rodzajowy do wymiany:

template <class Container> 
struct replace; 

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

Wow, zrobiłeś to. –

+0

"alloc" powinno prawdopodobnie również być ponownie powiązane z nowym typem. – Jarod42

0

nie jestem do końca pewien, czy to jest to, czego szukasz, ale nie będzie templatized alias deklaracji pasuje do przykładu?

#include <iostream> 
#include <map> 

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

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

Niestety nie, ponieważ chciałbym przekazać wyspecjalizowaną zmienną do funkcji szablonu i uzyskać dostęp do szablonu tam. – tsnorri

Powiązane problemy