用户定义类型上的空尖括号
Empty angle brackets on user defined types
我只知道 c++ 模板中空尖括号 <>
的 2 个用例,遇到的是:
1) 在模板完全专业化期间,例如
template<typename T>
class X
{};
template<>
class X<char>
{};
2) 在模板化函数调用期间可以推断出参数类型,例如
template<typename T>
T add(T a, T b);
...
add<>(1, 2);
但是这个案例对我来说是全新的,我无法理解这种语法的含义(请看一下rapidxml::xml_node<>*
):
class TestWidget : public GUI::Widget
{
public:
TestWidget(const std::string& name, rapidxml::xml_node<>* elem);
// ...
};
这里构造函数参数中的xml_node<>
类型赋予了什么语义???
还有默认模板参数:
template<typename T = char>
class X
{};
所以
X<> x; // X<char>
不是这种情况(默认模板参数,如 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;
}
有趣的是您无法区分大小写和变量声明。
我只知道 c++ 模板中空尖括号 <>
的 2 个用例,遇到的是:
1) 在模板完全专业化期间,例如
template<typename T>
class X
{};
template<>
class X<char>
{};
2) 在模板化函数调用期间可以推断出参数类型,例如
template<typename T>
T add(T a, T b);
...
add<>(1, 2);
但是这个案例对我来说是全新的,我无法理解这种语法的含义(请看一下rapidxml::xml_node<>*
):
class TestWidget : public GUI::Widget
{
public:
TestWidget(const std::string& name, rapidxml::xml_node<>* elem);
// ...
};
这里构造函数参数中的xml_node<>
类型赋予了什么语义???
还有默认模板参数:
template<typename T = char>
class X
{};
所以
X<> x; // X<char>
不是这种情况(默认模板参数,如 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;
}
有趣的是您无法区分大小写和变量声明。