Подтвердить что ты не робот

В чем смысл пустой "<>" в использовании шаблона?

В чем смысл строки tokenizer<> tok(s) в коде ниже? Я знаю, что < > используется во время работы с шаблонами, но в соответствии с моим пониманием < > не должно быть пустым - оно должно содержать определение типа.

    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";
}
4b9b3361

Ответ 1

Это просто означает, что шаблон должен использовать параметры по умолчанию. Например:

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

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

Ясно, что это возможно только тогда, когда все параметры шаблона имеют значения по умолчанию....

Для boost::tokenizer в частности, шаблон:

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

Ответ 2

Список шаблонов шаблонов может быть пустым, если у вас есть аргументы по умолчанию или у вас есть пакет аргументов, это описано в черновик проекта С++ раздел 14.3 Шаблонные аргументы, которые говорят (внимание мое):

Когда используются шаблоны аргументов шаблона или аргументы шаблона по умолчанию, Список шаблонов может быть пустым. В этом случае empty < > скобки все равно должны использоваться как список шаблонов-аргументов. [Пример:

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 пример]

В вашем случае boost:: tokenizer имеет следующие аргументы по умолчанию:

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

который позволяет вашему конкретному делу работать.

Ответ 3

Это означает, что используются аргументы шаблона по умолчанию.

Например, если у вас есть шаблон:

template < typename T = int >
struct A;

то для аргумента шаблона это будет иметь тип int:

A<> a;