关于C++:模板中的奇怪类型名称和构造函数

Strange typenames and constructor in a template

我正在尝试理解C++中的模板类。首先,我想了解这一行的含义:

1
2
template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix

其中,列和分配器分别是在别处定义的结构和类(命名空间abc中的第二个)。令我困扰的是,它似乎有一个已经初始化的类型名。这是什么意思?当我想使用这个模板时,我还应该初始化ORD和ALL的类型名吗?

此外,还有一个唯一的构造函数:

1
explicit matrix(unsigned int rows = 0, unsigned int cols = 0, T init = T())

但它似乎已经初始化了。init是什么意思?

我向您保证我看过所有代码,但是没有什么能帮助您更好地理解。谢谢你的关注。

编辑:谢谢大家的回答。只是一个小小的安慰(我是C++中的NoOB):

1
int const& operator() operator()(unsigned int i, unsigned int j) const

这个方法意味着,当初始化类foo时,我们可以通过foo()(1,2)调用它,其中i=1,j=2。我说的对吗?这两个"警察"是什么意思?

再次感谢!


1
2
3
4
5
template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix
{
    //...
};

这些是默认的模板参数,它们就像默认的函数参数一样工作——您可以指定它们,但是如果不指定,它们将是默认的。

您可以看到一个使用函数默认参数的例子。

底线-以下所有行都是正确的:

1
2
3
4
5
6
7
8
matrix<int> a; // matrix<int, columns, abc::allocator<int, 16> >
matrix<int, rows> b; // matrix<int, rows, abc::allocator<int, 16> >
matrix<int, columns, abc::other_allocator<int, 32> > c; // obvious

matrix<int> a = matrix<int>(); // constructor called with 0, 0 and
// int() - default constructed T - in this case, int -  as arguments
matrix<int> a(1, 2); // constructor called with 1, 2 and int() as arguments
matrix<int> a(1, 2, 100); // obvious

这意味着类的用户已经设置了一个合理的默认值——如中所述,您可以提供一个默认值,但您不必这样做。构造函数参数也是如此。至于这些论点的含义,只有你能回答。


正如C++中所知道的,函数参数可以有默认值,如果用户不提供这些参数,那么C++编译器就为它们使用默认值。现在在构造函数中,init的默认值为T(),这意味着使用其默认构造函数的类型值,例如,如果T=int,那么T()表示0,如果它是std::string,那么它是一个空字符串。您甚至可以将此语法用于其他参数:

1
2
3
4
explicit matrix(
    unsigned int rows = unsigned int(),
    unsigned int cols = unsigned int(),
    T init = T());

它是默认值。如果没有指定template参数,它将采用默认值。就像函数中有默认值一样:

1
void blah(int a = 0) { }