接受模板参数的类模版
template <template <typename...> typename E> class A 这个定义,在C++中通常被称为 类模板,并且因为它接受一个模板模板参数,所以更具体地可以称作 “接受模板模板参数的类模板”
专业术语称为 “带有模板模板参数的类模板”(Class Template with a Template Template Parameter)其实就是接受模版参数的类模版就行了 翻译的真恶心
大白话就会 A是吃“模板”的类模板——它要求你喂给它一个模板(如 std::vector),而不是一个具体类型(如 int)。
语法细节说明
-
typename与class的互换性:在声明模板参数时,typename和class关键字通常可以互换,没有区别
所以template <typename...> typename E和template <class...> class E是等价的。 - 可变参数包
typename...:typename...允许你接受的模板模板参数E本身是一个可以接受任意数量类型参数的模板(就像std::vector或std::map那样),这增加了灵活性一个简单的实例
#include <iostream> #include <vector> #include <list> // 一个接受模板模板参数 E 的类模板 A template <template <typename...> typename E> class A { private: // 使用 E 创建一个存储 int 的容器 E<int> intContainer; public: void add(int value) { intContainer.push_back(value); } void print() { for (const auto& item : intContainer) { std::cout << item << " "; } std::cout << std::endl; } }; int main() { // 用 std::vector 作为实际参数来实例化 A A<std::vector> aWithVector; aWithVector.add(1); aWithVector.add(2); aWithVector.print(); // 输出: 1 2 // 用 std::list 作为实际参数来实例化 A A<std::list> aWithList; aWithList.add(3); aWithList.add(4); aWithList.print(); // 输出: 3 4 return 0; }
上面的小demo基本上就能理解这个简单的概念了。复杂的模版元编程中剥离出来看其实很简单的
浙公网安备 33010602011771号