C++11實現可變參數模板類封裝

#include <memory.h>
/// <summary>
/// 對象池中的對象的模板類
/// </summary>

template<class T>
class CObjInstance
{
public:
    /// <summary>
    /// 重載new操作符
    /// </summary>
    /// <param name="nSize">分配內存大小</param>
    /// <returns></returns>
    void* operator new (size_t nSize)
    {
        return std::malloc(nSize);
    }

    /// <summary>
    /// 重載delete操作符
    /// </summary>
    /// <param name="p"></param>
    void operator delete (void* p)
    {
        std::free(p);
    }

    /// <summary>
    /// 創建對象
    /// </summary>
    /// <param name="...args">可變參數</param>
    /// <returns></returns>
    template<typename ...Args>//可變參數
    static T* CreateObj(Args ... args)
    {
        T* obj = new T(args...);
        return obj;
    }

    static void DeleteObj(T* obj)
    {
        delete obj;
    }

};

測試代碼:

#include "CObjInstance.h"

class A: public CObjInstance<A>
{
public:
    A(int n)
    {
        a = n;
    }

    ~A()
    {
        std::cout << "~A" << std::endl;
    }

public:
    int a = 0;
};

class B: public CObjInstance<B>
{
public:
    B(int n, int m)
    {
        a = n;
        b = m;
    }

    ~B()
    {
        std::cout << "~B" << std::endl;
    }

public:
    int a = 0;
    int b = 0;
};
void Test()
{
    A* a = A::CreateObj(3);
    std::cout << a->a << std::endl;
    A::DeleteObj(a);
    B* b = B::CreateObj(6, 9);
    std::cout << b->a << b->b << std::endl;
    B::DeleteObj(b);
}

int main()
{
    Test();
    std::cout << "Hello World!\n";
}

實現結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章