c++泛型示例

一个粗糙的c++范型示例

#include <iostream>
#include <fstream>
#include <sys/stat.h>
#include <vector>

using namespace std;

class CacheDataA
{
public:
    int aValue;
};

class CacheDataB
{
public:
    int bValue1;
    int bValue2;
};

template <class T>
class BaseCacheEngin
{
public:
    BaseCacheEngin(int maxCacheCount);
    std::vector<T *> cacheDataList;
    int cacheData(T *cacheData);
    T *popData();

private:
    int mMaxCacheCount;
};

template <class T>
BaseCacheEngin<T>::BaseCacheEngin(int maxCacheCount)
{
    mMaxCacheCount = maxCacheCount;
}

template <class T>
int BaseCacheEngin<T>::cacheData(T *cacheData)
{
    cacheDataList.push_back(cacheData);
    if(cacheDataList.size()>mMaxCacheCount){
        cacheDataList.erase(cacheDataList.end());
    }
    return 0;
}

template <class T>
T *BaseCacheEngin<T>::popData()
{
    if (cacheDataList.empty())
    {
        return NULL;
    }
    return cacheDataList.front();
}

int main()
{
    cout << "hello world!\n";

    BaseCacheEngin<CacheDataA> *cacheEnginA = new BaseCacheEngin<CacheDataA>(3);
    BaseCacheEngin<CacheDataB> *cacheEnginB = new BaseCacheEngin<CacheDataB>(5);

    CacheDataA *a1 = new CacheDataA();
    CacheDataA *a2 = new CacheDataA();
    CacheDataA *a3 = new CacheDataA();
    CacheDataA *a4 = new CacheDataA();
    a1->aValue = 1;
    a2->aValue = 2;
    a3->aValue = 3;
    a4->aValue = 4;
    int result = cacheEnginA->cacheData(a1);
    result = cacheEnginA->cacheData(a2);
    result = cacheEnginA->cacheData(a3);
    result = cacheEnginA->cacheData(a4);
    cout << "cacheData result:" << result << "\n";

    CacheDataB *b = new CacheDataB();
    b->bValue1 = 1;
    b->bValue2 = 3;
    result = cacheEnginB->cacheData(b);
    cout << "cacheData b result:" << result << "\n";

    CacheDataA *aTemp = (CacheDataA *)cacheEnginA->popData();
    cout << "pop Cache data A, value:" << aTemp->aValue << "\n";

    CacheDataB *bTemp = (CacheDataB *)cacheEnginB->popData();
    cout << "pop Cache data B, value1:" << bTemp->bValue1 << "\n";

    /**
     * With Templete limit, this code will cause build error:
     * cannot convert ‘CacheDataB*’ to ‘CacheDataA*’
     */
    // cacheEnginA->cacheData(b);

    cout << "Bye!\n";
    return 0;
}

模板方法示例:

template<typename T>
bool remove_array(std::vector<T> &array, T v)
{
  typename std::vector<T>::iterator it = std::find(array.begin(), array.end(), v);
  if (it == array.end())
  {
    return false;
  }
  std::swap(*it, array.back());
  array.pop_back();
  return true;
}
### C++ 编程的使用方法与示例 #### 函数模板 函数模板是编程的基础之一,用于定义适用于多种数据类的函数。通过模板参数,可以指定函数操作的数据类。 以下是函数模板的一个简单例子: ```cpp template <typename T> T max(T a, T b) { return (a > b) ? a : b; } ``` 上述代码展示了如何定义一个 `max` 函数模板[^1],该模板接受两个相同类的参数并返回较大的那个值。此函数可以在任何支持比较运算符的数据类上工作。 调用方式如下所示: ```cpp int main() { int i = 5, j = 10; double f = 3.5, g = 7.8; std::cout << "Max of integers: " << max(i, j) << std::endl; // 输出较大整数 std::cout << "Max of doubles: " << max(f, g) << std::endl; // 输出较大小数 return 0; } ``` #### 类模板 除了函数模板外,C++ 还支持类模板的概念,这使得我们能够创建独立于特定数据类的容器或其他复杂对象。 下面是一个简单的栈(Stack)实现作为类模板的例子: ```cpp #include <vector> template <typename T> class Stack { private: std::vector<T> elements; public: void push(T const& elem); // 将元素压入堆栈 void pop(); // 移除顶部元素 T top() const; // 返回最上面的元素副本 bool empty() const { // 如果为空则返回 true return elements.empty(); } }; // 定义成员函数 template <typename T> void Stack<T>::push(const T &elem) { elements.push_back(elem); } template <typename T> void Stack<T>::pop() { if (!empty()) { elements.pop_back(); } else { throw std::out_of_range("Stack<>::pop(): empty stack"); } } template <typename T> T Stack<T>::top() const { if (!empty()) return elements.back(); else throw std::out_of_range("Stack<>::top(): empty stack"); } ``` 在这个例子中,`Stack` 是一个通用的类模板,它可以存储任意类的数据[^2]。用户可以根据需求实例化不同类的栈,比如 `Stack<int>` 或者 `Stack<std::string>`。 #### STL 中的应用 标准模板库(STL)广采用了编程的思想。例如,`std::vector`, `std::list`, 和其他容器都是基于模板设计的,它们能容纳各种各样的数据类[^3]。 以下是如何利用 STL 的 `std::vector` 来管理动态数组的一个基本案例: ```cpp #include <iostream> #include <vector> int main(){ std::vector<double> vec{1.1, 2.2, 3.3}; for(auto num : vec){ std::cout << num << ' '; } return 0; } ``` 这段代码展示了一个双精度浮点数向量的操作过程,并打印其中的内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值