专业编程基础技术教程

网站首页 > 基础教程 正文

C++ 类模板之模板参数(c++中用模板类的意义)

ccvgpt 2024-08-03 12:32:21 基础教程 22 ℃

当我们定义类模板时,我们需要声明模板参数,以指定类模板所使用的类型或值。

模板参数是用于定义模板的占位符,它们允许我们在编译时指定模板中使用的类型或值。在类模板或函数模板中,我们可以在尖括号中声明一个或多个模板参数,并在模板定义中使用这些参数来定义类或函数的成员。

C++ 类模板之模板参数(c++中用模板类的意义)

// T1 和 T2 就是模板参数
template <typename T1, typename T2>
class MyPair {
	// 省略定义
}

在 C++ 中,类模板的模板参数可以是类型参数、非类型参数、模板参数或模板参数包

类型参数

类型参数指定了类中使用的数据类型,它们在类定义中用 typename 或 class 关键字声明。我们可以在类中使用这些类型参数,就像使用任何其他类型一样。例如,以下是一个使用类型参数的类模板示例:

template <typename T>
class MyStack {
public:
    MyStack() {}

    void push(const T& item) { /*省略实现*/ }

    T pop() { /*省略实现*/ }

private:
    vector<T> data_;
};

非类型参数

非类型参数指定了一个值或一个常量表达式,它们在类定义中用一个类型和一个名称声明。我们可以在类中使用这些非类型参数,就像使用常量或值一样。以下是一个使用非类型参数的类模板示例:

template <typename T, int Size>
class MyArray {
public:
    MyArray() {}

    void fill(const T& item) { /*省略实现*/ }

private:
    T data_[Size];
};

模板模板参数

当类模板的模板参数类型为模板参数时,我们称之为模板模板参数(template template parameter)。

使用模板模板参数可以使类模板更加灵活,它可以让你指定一个模板作为类模板的模板参数,从而生成一个更加具有通用性的类模板。

模板模板参数的语法形式如下:

template <typename T, template <typename> class Container>
class MyClass {
  // ...
};

这里的 Container 是一个模板模板参数,它接受一个模板类型参数 typename,表示这个模板接受一个类型参数。因此,你可以将一个 STL 容器模板(如 std::vector)作为参数传递给 MyClass。

下面是一个使用模板模板参数的示例:

#include <iostream>
#include <vector>

template <typename T, template <typename> class Container>
class MyClass {
public:
  void print(Container<T> values) {
    for (auto& value : values) {
      std::cout << value << std::endl;
    }
  }
};

int main() {
  MyClass<int, std::vector> my_class;
  std::vector<int> values = {1, 2, 3, 4, 5};
  my_class.print(values);
  return 0;
}

在上面的示例中,我们使用了 std::vector 作为模板模板参数,从而生成了一个 MyClass<int, std::vector> 的类模板。

可变参数模板/模板参数包(C++11 起)

当类模板的模板参数为可变参数时,我们称之为可变参数模板(variadic template)。

可变参数模板允许我们定义可以接受任意数量和类型的参数的模板类或函数。在可变参数模板中,我们使用了 ... 语法来表示可变参数。

#include <iostream>

template<typename... Args>
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;
}

Tags:

最近发表
标签列表