2014-09-12 2 views
27

Was bedeutet tokenizer<> tok(s) Zeile im Code unten? Ich weiß, dass <> während der Arbeit mit Vorlagen verwendet wird, aber nach meinem Verständnis <> sollte nicht leer sein - es sollte Typdefinition enthalten.Was bedeutet leeres "<>" in der Vorlagenverwendung?

using namespace std; 
    using namespace boost; 
    string s = "This is, a te\x1Dst"; 
    cout<<s<<endl; 
    tokenizer<> tok(s); 
    for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
} 
+0

Wie andere darauf hingewiesen haben, kann dies verwendet werden, wenn Sie Standardargumente haben, aber sie vermissten Argument-Packs, die ich in meiner Antwort erkläre. –

+0

'<>' erscheint häufiger in Vorlagenspezialisierungen, aber das ist ein anderer Anwendungsfall als der von Ihnen angezeigte Code. – nwp

+0

Es bedeutet "anders" –

Antwort

26

Es bedeutet nur, dass die Vorlage die Standardparameter verwenden sollte. Zum Beispiel:

template <int N = 10> 
class X { }; 

X<> x; // this is an X<10> 
Klar

, dann ist es nur möglich, wenn alle Template-Parameter Standardwerte haben ....

für boost::tokenizer Insbesondere ist die Vorlage:

template < 
    class TokenizerFunc = char_delimiters_separator<char>, 
    class Iterator = std::string::const_iterator, 
    class Type = std::string 
> 
class tokenizer; 
5

Es bedeutet, dass Standardvorlage Argumente werden verwendet.

Zum Beispiel, wenn Sie eine Vorlage haben:

template < typename T = int > 
struct A; 

dann würde diese Art hat int für das Template-Argument:

A<> a; 
8

Die Template-Argumentliste kann leer sein, wenn Sie haben Standardargumente oder Sie haben ein Argument pack, dies wird in der draft C++ standard Abschnitt 14.3Vorlage Argumente, die sagen s (Hervorhebung von mir):

Wenn Template-Argumente Pack oder Standard-Template-Argumente verwendet werden, eine Template-Argumentliste können leer sein. In diesem Fall sollte die leere <> Klammer immer noch als Vorlage-Argument-Liste verwendet werden. [Beispiel:

template<class T = char> class String; 
String<>* p; // OK: String<char> 
String* q; // syntax error 
template<class ... Elements> class Tuple; 
Tuple<>* t; // OK: Elements is empty 
Tuple* u; // syntax error 

-Ende Beispiel]

In Ihrem Fall boost::tokenizer hat folgende Standardargumente:

template < 
    class TokenizerFunc = char_delimiters_separator<char>, 
    class Iterator = std::string::const_iterator, 
    class Type = std::string > 

, die Ihren speziellen Fall erlaubt zu arbeiten.