【C++】模板嵌套

模板嵌套

1.模板模板参数:允许将一个“模板”作为另一个模板的参数传入。

template<template<typename> class Container, typename T>
class Wrapper {
public:
    Container<T> data;
};

使用示例:

Wrapper<std::vector, int> w;  // std::vector<int>

 

2. 类模板中类嵌套模板

template<typename T>
class Outer {
public:
    template<typename U>
    class Inner {
    public:
        void show() {
            std::cout << "Outer<" << typeid(T).name()
                      << ">::Inner<" << typeid(U).name() << ">" << std::endl;
        }
    };
};

使用示例:

Outer<int>::Inner<double> obj;
obj.show();
// 输出类似:Outer<i>::Inner<d>

 

#include <vector>
#include <list>
#include <iostream>

// 定义一个可以接受任何单参数容器模板的类
template <template<typename> class Container>
class Stack {
private:
    Container<int> data;
    
public:
    void push(int value) {
        data.push_back(value);
    }
    
    void pop() {
        if (!data.empty()) {
            data.pop_back();
        }
    }
    
    int top() const {
        return data.back();
    }
    
    bool empty() const {
        return data.empty();
    }
};

int main() {
    Stack<std::vector> vectorStack;  // 使用vector作为底层容器
    Stack<std::list> listStack;      // 使用list作为底层容器
    
    vectorStack.push(1);
    vectorStack.push(2);
    
    std::cout << vectorStack.top() << std::endl;  // 输出: 2
    
    return 0;
}

 

 

 

#include <map>
#include <unordered_map>
#include <string>

// 接受双参数容器模板
template <template<typename, typename> class Container>
class Dictionary {
private:
    Container<std::string, int> data;
    
public:
    void insert(const std::string& key, int value) {
        data[key] = value;
    }
    
    int find(const std::string& key) const {
        auto it = data.find(key);
        return (it != data.end()) ? it->second : -1;
    }
};

int main() {
    Dictionary<std::map> orderedDict;        // 使用map
    Dictionary<std::unordered_map> hashDict; // 使用unordered_map
    
    orderedDict.insert("apple", 5);
    hashDict.insert("banana", 3);
    
    return 0;
}

 

posted @ 2018-09-12 20:52  苏格拉底的落泪  阅读(165)  评论(0)    收藏  举报