模板用法中空"<>"的含义是什么?

vic*_*ico 33 c++ templates

tokenizer<> tok(s)以下代码中line 的含义是什么?我知道在使用模板时会使用<>,但根据我的理解,<>不应该为空 - 它应该包含类型定义.

    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";
}
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 31

它只是意味着模板应该使用默认参数.例如:

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

X<> x;  // this is an X<10> 
Run Code Online (Sandbox Code Playgroud)

显然,只有当所有模板参数都有默认值时(或者对于没有强制参数的可变参数模板 - 见下文),才有可能....

对于boost::tokenizer具体而言,模板的:

template <
    class TokenizerFunc = char_delimiters_separator<char>, 
    class Iterator = std::string::const_iterator,
    class Type = std::string
>
class tokenizer;
Run Code Online (Sandbox Code Playgroud)

它与您的问题正文所关注的"意义tokenizer<> tok"无关,而是与模板用法中"更为一般的问题标题"空白的含义"<>"相关联?...

正如Shafik首先提到的,my_template<>表单也可以与可变参数模板一起使用,例如std::tuple指定一个空参数包:

// namespace std { template <class ...Args> class tuple; }
std::tuple<> t;  // this tuple can't store anything :-.
Run Code Online (Sandbox Code Playgroud)


Sha*_*our 11

模板参数列表可以是空的,当你有默认参数,或者你有一个参数包,这是包括在草案C++标准的部分14.3 模板参数它说(重点煤矿):

使用模板参数包或默认模板参数时,模板参数列表可以为空.在这种情况下,空<>括号仍应用作模板参数列表.[例如:

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
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

在您的情况下,boost :: tokenizer具有以下默认参数:

template <
    class TokenizerFunc = char_delimiters_separator<char>, 
    class Iterator = std::string::const_iterator,
    class Type = std::string >
Run Code Online (Sandbox Code Playgroud)

这允许您的特定案例工作.


BЈо*_*вић 6

这意味着使用默认模板参数.

例如,如果您有一个模板:

template < typename T = int >
struct A;
Run Code Online (Sandbox Code Playgroud)

那么这将有int模板参数的类型:

A<> a;
Run Code Online (Sandbox Code Playgroud)