C++ 11實(shí)現(xiàn)對(duì)象池

技術(shù)原理甥捺,

  1. 使用std::shared_ptr的刪除函數(shù),在對(duì)象析構(gòu)時(shí)辫呻,將對(duì)象退還回對(duì)象池的multimap中
  2. 使用可變參數(shù)實(shí)現(xiàn)任意對(duì)象的構(gòu)造

代碼如下劳较,
noncopyable.hpp

#ifndef _NONCOPYABLE_HPP_
#define _NONCOPYABLE_HPP_

class NonCopyable {
    public:
        NonCopyable(const NonCopyable& n) = delete; // deleted
        NonCopyable& operator=(const NonCopyable& n) = delete; // deleted
        NonCopyable() = default; // available
};
#endif

object_pool.hpp

#include <string>
#include <functional>
#include <memory>
#include <map>
#include "noncopyable.hpp"
using std::string;
using std::shared_ptr;
using std::multimap;

const int MaxObjectNum = 10;

template <typename T>
class ObjectPool: public NonCopyable {
    template <typename ... Args>
    // 輸入為Args類型,返回為std::shared_ptr<T>類型的函數(shù)
    using Constructor = std::function<shared_ptr<T>(Args...)>;
    public:

        // 初始化對(duì)象池
        template <typename ... Args> 
        void Init(size_t num, Args &&... args) {
            if(num <= 0 || num > MaxObjectNum) {
                throw std::logic_error("object num out of range");
            }

            auto constructorName = typeid(Constructor<Args...>).name();
            for(size_t i=0; i < num; ++i) {
                m_object_map.emplace(constructorName, shared_ptr<T>(new T(std::forward<Args>(args)...),
                    [this, constructorName] (T* p){  // 刪除器中回收到對(duì)象池棵红,供下次使用,刪除時(shí)used_count-1凶赁,使用p構(gòu)造一個(gè)新的,令used_count + 1
                        m_object_map.emplace(std::move(constructorName), shared_ptr<T>(p));                      
                    } ));
            }
        }

        // 從對(duì)象池中獲取一個(gè)對(duì)象
        template <typename ... Args>
        shared_ptr<T> Get() {
            string constructName = typeid(Constructor<Args...>).name();
            auto range = m_object_map.equal_range(constructName);
            for(auto it = range.first; it != range.second; it++) {
                auto ptr = it->second;
                m_object_map.erase(it);
                return ptr;
            }
            return nullptr;
        }

    private:
        multimap<string, std::shared_ptr<T> > m_object_map;
};  

main.cpp

#include "object_pool.hpp"
#include <iostream>
using std::cout;
using std::endl;

// MySQL連接器類
class MySQLConn: NonCopyable {
    public:
        MySQLConn(string url, string username, string password): mURL(url), mUser(username), mPass(password) {}

        void ExecSQL(const string& sql) {
            cout << "Exec: [" << sql << "]" << endl;
        }

    private:    
        MySQLConn() = delete;
        string mURL;
        string mUser;
        string mPass;
};

int main() {
    ObjectPool<MySQLConn> p;
    p.Init(5, "jdbc:mysql", "root", "root");
    shared_ptr<MySQLConn> conn = p.Get();
    conn->ExecSQL("insert into stu(id, name, score) values(1, '張三', 78.5);");
    
}

Makefile

TAR=main
WORKSPACE_DIR=.
CC:=g++

.PHONY: build clear all

build:
    $(CC) -std=c++11 $(WORKSPACE_DIR)/*.*pp -g -o $(TAR)

all: clear build

clear:
    rm -rf $(TAR)

程序輸出如下


圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逆甜,一起剝皮案震驚了整個(gè)濱河市虱肄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌交煞,老刑警劉巖咏窿,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異素征,居然都是意外死亡集嵌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門御毅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)根欧,“玉大人,你說我怎么就攤上這事端蛆》锎郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵今豆,是天一觀的道長(zhǎng)嫌拣。 經(jīng)常有香客問我,道長(zhǎng)呆躲,這世上最難降的妖魔是什么异逐? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮歼秽,結(jié)果婚禮上应役,老公的妹妹穿的比我還像新娘。我一直安慰自己燥筷,他們只是感情好箩祥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肆氓,像睡著了一般袍祖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谢揪,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天蕉陋,我揣著相機(jī)與錄音捐凭,去河邊找鬼。 笑死凳鬓,一個(gè)胖子當(dāng)著我的面吹牛茁肠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缩举,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼垦梆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仅孩?” 一聲冷哼從身側(cè)響起托猩,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辽慕,沒想到半個(gè)月后京腥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溅蛉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年公浪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片温艇。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡因悲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勺爱,到底是詐尸還是另有隱情,我是刑警寧澤讯检,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布琐鲁,位于F島的核電站,受9級(jí)特大地震影響人灼,放射性物質(zhì)發(fā)生泄漏围段。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一投放、第九天 我趴在偏房一處隱蔽的房頂上張望奈泪。 院中可真熱鬧,春花似錦灸芳、人聲如沸涝桅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冯遂。三九已至,卻和暖如春谒获,著一層夾襖步出監(jiān)牢的瞬間蛤肌,已是汗流浹背壁却。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裸准,地道東北人展东。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炒俱,于是被迫代替她去往敵國(guó)和親盐肃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容