2016-02-12 6 views
5

Gibt es eine Möglichkeit, die Vorlage aus einer Vorlagenspezialisierung zu erhalten? Z.B. std::unordered_map von einer Variablen des Typs std::unordered_map<char, char>, die als Vorlagevorlagenparameter übergeben werden soll.Vorlage aus Vorlagenspezialisierung

Minimal Beispiel:

#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

Es hängt davon ab, was Sie mit der Vorlage tun mögen. Im Allgemeinen können Sie Typen aber keine Vorlagen weitergeben. Was Sie möglicherweise tun können, ist die Template-Parameter zu ersetzen. Kannst du mehr Kontext geben? – MarkusParker

+0

Ich habe ein paar Klassen, die (aus Gründen der Polymorphie) einen Template-Template-Parameter nehmen und daraus eine Spezialisierung machen. Die Klassen stellen eine minimale Schnittstelle zu einem Kartentyp-Container bereit. Man nimmt eine 'std :: map', eine andere einen' std :: vector' und implementiert perfektes Hashing. Um eine Anzahl von Spezialisierungen der Klassen zu testen, wäre es zweckmäßig, eine Funktion zu schreiben, die nur einen Modellcontainer (z.B. "std :: map ") aufnehmen würde, dessen Vorlage dann an meine Klasse übergeben würde. – tsnorri

Antwort

3

Hier ist ein Beispiel dafür, wie eine neue Art zu schaffen, in dem die Template-Parameter (int) (von string) ausgetauscht wird:

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

So können Sie std :: unordered_map als Vorlage passieren kann Parameter für Ihre Funktion und ersetzen Sie char durch einen anderen Typ, den Sie möchten. Möglicherweise müssen Sie mein Beispiel an Ihre Bedürfnisse anpassen. Aber das Prinzip sollte klar sein.

EDIT: Weitere generic für Container, weniger generisch für Ersatz:

template <class Container> 
struct replace; 

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

Wow, du hast es geschafft. –

+0

'alloc' sollte wahrscheinlich auch auf neuen Typ zurückprallen. – Jarod42

0

Ich bin nicht ganz sicher, ist es das, was Sie suchen, aber nicht Alias ​​Erklärung passen in Ihrem Beispiel templatized?

#include <iostream> 
#include <map> 

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

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

Leider nicht, da ich eine spezialisierte Variable an eine Template-Funktion übergeben und dort auf die Vorlage zugreifen möchte. – tsnorri

Verwandte Themen