2016-07-07 29 views
3

Heute habe ich versucht, eine Vorlagenklasse an einen Vorlagenparameter zu übergeben. Meine Vorlagenklasse std::map hat vier Vorlagenparameter, aber die letzten beiden sind Standardparameter.Vorlagenklasse als Vorlagenparameter Standardparameter

konnte ich den folgenden Code zu kompilieren:

#include <map> 

template<typename K, typename V, typename P, typename A, 
    template<typename Key, typename Value, typename Pr= P, typename All=A> typename C> 
struct Map 
{ 
    C<K,V,P,A> key; 
}; 

int main(int argc, char**args) { 
    // That is so annoying!!! 
    Map<std::string, int, std::less<std::string>, std::map<std::string, int>::allocator_type, std::map> t; 
    return 0; 
} 

Leider, ich will nicht die beiden letzten Parameter die ganze Zeit passieren. Das ist wirklich zu viel Schreiben. Wie kann ich hier einige Standard-Template-Argumente verwenden?

Antwort

5

könnten Sie verwenden type template parameter pack (da C++ 11) variadische Template-Parameter zu ermöglichen:

template<typename K, typename V, 
    template<typename Key, typename Value, typename ...> typename C> 
struct Map 
{ 
    C<K,V> key; // the default value of template parameter Compare and Allocator of std::map will be used when C is specified as std::map 
}; 

dann

Map<std::string, int, std::map> t; 
+0

Vielen Dank! Ich war mir dieser neuen variadischen Vorlagen nicht bewusst. Elegant und kurz. – Aleph0

3

Nicht ideal, aber:

#include <map> 

template<typename K, typename V, typename P, 
    typename A=typename std::map<K, V, P>::allocator_type, 
    template<typename Key, typename Value, typename Pr= P, typename All=A> typename C=std::map> 
struct Map 
{ 
    C<K,V,P,A> key; 
}; 

int main(int argc, char**args) { 
    Map<std::string, int, std::less<std::string>> t; 
    return 0; 
} 
+0

Nicht so schlecht, falls der Benutzer 'std :: less ' ersetzen muss. – Aleph0

Verwandte Themen