2014-09-12 11 views
27

Qual è il significato della riga tokenizer<> tok(s) nel seguente codice? So che <> viene utilizzato mentre si lavora con i modelli, ma secondo la mia comprensione <> non dovrebbe essere vuoto- dovrebbe contenere la definizione del tipo.Qual è il significato di vuoto "<>" nell'uso del modello?

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

Come altri hanno sottolineato, questo può essere utilizzato quando si hanno argomenti predefiniti ma si sono persi i pacchetti di argomenti, che spiego nella mia risposta. –

+0

'<>' appare più comunemente nelle specializzazioni template, ma si tratta di un caso d'uso diverso dal codice che hai mostrato. – nwp

+0

Significa "diverso" –

risposta

26

Significa solo che il modello deve utilizzare i parametri predefiniti. Per esempio:

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

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

Chiaramente, è possibile solo quando tutti i parametri del modello hanno valori di default ....

Per boost::tokenizer specificamente, del modello:

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

Ciò significa che gli argomenti di template di default sono usati.

Ad esempio, se si ha un modello:

template < typename T = int > 
struct A; 

allora questo avrebbe tipo int per l'argomento modello:

A<> a; 
8

L'elenco modello-argomento può essere vuoto quando si avere argomenti predefiniti o un argomento pack, questo è trattato nella sezione draft C++ standard14.3Argomenti modello che dicono s (sottolineatura mia):

Quando confezioni argomenti template predefiniti o template-argomenti vengono utilizzati, un elenco modello-argomento può essere vuoto. In tal caso, le parentesi vuote svuotate svuotano il numero come elenco-argomento-modello. [Esempio:

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 

-end esempio]

Nel tuo caso boost::tokenizer presenta le seguenti argomenti di default:

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

che permette al vostro caso specifico al lavoro.

Problemi correlati