接受模板参数的类模版

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基本上就能理解这个简单的概念了。复杂的模版元编程中剥离出来看其实很简单的

 

posted on 2025-10-29 10:31  zhangkele  阅读(9)  评论(0)    收藏  举报

导航