用户定义类型上的空尖括号

amp*_*awd 2 c++ templates template-specialization c++11

对于<>c++ 模板中的空尖括号,我只知道 2 个用例,它们遇到了:

1)在模板完全专业化期间,例如

template<typename T>
class X
{};

template<>
class X<char>
{};
Run Code Online (Sandbox Code Playgroud)

2) 在模板化函数调用期间,可以推断出哪些参数类型,例如

template<typename T>
T add(T a, T b);

...  

add<>(1, 2);
Run Code Online (Sandbox Code Playgroud)

但是这个案例对我来说是全新的,我无法理解这种语法的含义(请看一下rapidxml::xml_node<>*):

class TestWidget : public GUI::Widget
{
public:
    TestWidget(const std::string& name, rapidxml::xml_node<>* elem);
    // ...
};
Run Code Online (Sandbox Code Playgroud)

xml_node<>构造函数参数中的类型赋予了什么语义???

Jar*_*d42 5

还有默认模板参数:

template<typename T = char>
class X
{};
Run Code Online (Sandbox Code Playgroud)

所以

X<> x; // X<char> 
Run Code Online (Sandbox Code Playgroud)


max*_*x66 5

不是这种情况(默认模板参数,如 Jarod42 的答案),但该语法也可以声明具有空模板参数列表的可变参数模板类型的对象。

或两者。

#include <iostream>

// default value
template <typename = void>
struct foo
 { };

// variadic list
template <int ...>
struct bar
 { };

// both
template <int = 0, typename ...>
struct foobar
 { };


int main ()
 {    
   foo<>     f;
   bar<>     b;
   foobar<>  fb;
 }
Run Code Online (Sandbox Code Playgroud)

有趣的是,您无法将案例与变量声明区分开来。