2017-09-15 84 views
1

我想實現一個簡單的模板ObjectPool類的類。 它有一個固定大小的矢量作爲成員變量,其中的元素'在創建時默認初始化。 這已經完成,工作正常。任意數量的帶模板類的參數賦值

問題是什麼是向成員矢量分配新元素的最佳方式是什麼?

我實現了add_old_way成員函數,它能夠將任何類型的數據添加到ObjectPool中,並且工作正常。 我唯一的問題是,我創建了一個額外的對象,我傳遞給該函數,並在裏面,我只是把它扔掉後分配。如果我們正在談論巨型課程,就會浪費資源。

我該如何實現add_new_way函數能夠取任意參數並將它們分別賦值給向量元素?

請注意ObjectPool是模板化的,所以任何種類的類都可以是它的類型,而不僅僅是Bar或Matrix2x2,如下例所示。

我現在不是在這裏關鍵詞來查看它在互聯網上,如果可能的話。

謝謝!

template <class T> 
class ObjectPool 
{ 
    vector<T> mObjects; 

    ObjectPool() : mObjects(size) 
    { 
    } 

    //that's what i could come up with to add an object to the object pool 
    void add_old_way(const T& object) 
    { 
     ... 
     mObjects[nextFreeIndex] = object; 
     ... 
    } 

    //desired way of adding object 
    void add_new_way(...) 
    { 
     mObjects[nextFreeIndex].param1 = param1; 
     mObjects[nextFreeIndex].param2 = param2; 
     ... 
     mObjects[nextFreeIndex].paramN = paramN; 
    } 

}; 

class Bar 
{ 
    Bar(int x, string s) 
    { 
     mX = x; 
     mS = s; 
    } 

    int mX; 
    string mS; 
}; 


int main() 
{ 
    ObjectPool<Bar> v; 
    ObjectPool<Matrix2x2> v; 

    //that's what i could come up with 
    v.add_old_way(cBar(1,"asdf")); 
    v.add_old_way(cMatrix2x2(1,2,3,4)); 

    //desired way of adding object 
    v.add_new_way(1,"asdf"); 
    v.add_new_way(1,2,3,4); 

} 
+3

你想這個表現得像''從的std :: VECTOR' emplace_back'? – Justin

+0

@Justin我剛纔查了一下,並沒有意識到這一點。是的,類似的東西,甚至查看源代碼,但不知道如何處理這些任意數量的參數並單獨分配。 – Avithohol

+0

OT:如果向量的大小是固定的,那麼'std :: array'怎麼樣? – max66

回答

1

利用移動語義和完美轉發使作業便宜:

template <typename... Args> 
void add_new_way(Args&&... args) 
{ 
    mObjects[nextFreeIndex] = T{std::forward<Args>(args)...}; 
} 

Live on Coliru

由於對象被從分配是暫時的,該對象的移動-賦值運算符被分配,如果它存在於將被調用。這將使對象將所有昂貴的複製資源的所有權從臨時對象轉移到對象池中。

對於進一步的閱讀,看看這個問題:What are move semantics?

1

如果使用C++ 11以上,實現你add_new_way方法,你可以使用可變參數模板參數和轉發:

template <typename... Args> 
void add_new_way(Args... args) { 
    mObjects.emplace_back(std::forward<Args>(args)...); 
} 

然後調用代碼可以做:

v.add_new_way(arg1, arg2, ..., argN); 
+0

Variadic模板和轉發...永遠不會知道他們這樣稱呼,謝謝!我查了一下&&操作符,我想我也應該使用它,所以解決方案標記去@Miles Budnek – Avithohol