当我们定义类模板时c++模板类,我们需要声明模板参数,以指定类模板所使用的类型或值。
模板参数是用于定义模板的占位符,它们允许我们在编译时指定模板中使用的类型或值。在类模板或函数模板中,我们可以在尖括号中声明一个或多个模板参数,并在模板定义中使用这些参数来定义类或函数的成员。
// T1 和 T2 就是模板参数
template
class MyPair {
// 省略定义
}
在 C++ 中,类模板的模板参数可以是类型参数、非类型参数、模板参数或模板参数包
类型参数
类型参数指定了类中使用的数据类型c++模板类,它们在类定义中用 typename 或 class 关键字声明。我们可以在类中使用这些类型参数,就像使用任何其他类型一样。例如,以下是一个使用类型参数的类模板示例:
template
class MyStack {
public:
MyStack() {}
void push(const T& item) { /*省略实现*/ }
T pop() { /*省略实现*/ }
private:
vector data_;
};
非类型参数
非类型参数指定了一个值或一个常量表达式,它们在类定义中用一个类型和一个名称声明。我们可以在类中使用这些非类型参数,就像使用常量或值一样。以下是一个使用非类型参数的类模板示例:
template
class MyArray {
public:
MyArray() {}
void fill(const T& item) { /*省略实现*/ }
private:
T data_[Size];
};
模板模板参数
当类模板的模板参数类型为模板参数时,我们称之为模板模板参数(template template parameter)。
使用模板模板参数可以使类模板更加灵活,它可以让你指定一个模板作为类模板的模板参数,从而生成一个更加具有通用性的类模板。
模板模板参数的语法形式如下:
template <typename T, template class Container>
class MyClass {
// ...
};
这里的 Container 是一个模板模板参数,它接受一个模板类型参数 typename,表示这个模板接受一个类型参数。因此,你可以将一个 STL 容器模板(如 std::vector)作为参数传递给 MyClass。
下面是一个使用模板模板参数的示例:
#include
#include
template <typename T, template class Container>
class MyClass {
public:
void print(Container values) {
for (auto& value : values) {
std::cout << value << std::endl;
}
}
};
int main() {
MyClass my_class;
std::vector values = {1, 2, 3, 4, 5};
my_class.print(values);
return 0;
}
在上面的示例中,我们使用了 std::vector 作为模板模板参数,从而生成了一个 MyClass 的类模板。
可变参数模板/模板参数包(C++11 起)
当类模板的模板参数为可变参数时,我们称之为可变参数模板(variadic template)。
可变参数模板允许我们定义可以接受任意数量和类型的参数的模板类或函数。在可变参数模板中,我们使用了 … 语法来表示可变参数。
#include
template
void print(Args... args) {
std::cout << "Number of arguments: " << sizeof...(args) << std::endl;
std::cout << "Arguments: ";
(std::cout << ... << args) << std::endl;
}
int main() {
print(1, 2.0, "hello");
return 0;
}
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688