2017-02-24 52 views
0

我正在實現對某些對象的向量進行操作的函數,爲了簡單起見,我們假設它計算總和。獨立於元素內存管理的向量上的函數

函數的邏輯與它的對象矢量,對象的原始指針或唯一/弱/共享指針無關。

如何在不重複代碼的情況下以最小的開銷爲用戶實現它?


編輯:

的解決方案適用於不同的指針,而不是對象。好吧,也許沒有辦法繞開它,除非在任何地方使用指針,並強制用戶創建指針向量,如果他想使用該函數。至少比其他方式更容易。

我想盡可能保持我的對象類型,因爲我對它很滿意。現在不是運動員的載體,窗口小部件,矩陣或任何有意義的事情,我被迫使用T.在這種情況下,我很想有像template <class T extends MyLovelyClass>,但是這並不是C++ ...

#include <vector> 
#include <memory> 

class A{ 
public: 
    int get(){return 1;} 
}; 

template<typename T, typename Iterator> 
int sum(Iterator begin, Iterator end) { 
    T result = {}; 
    for(auto it = begin; it != end; ++it) { 
     result += (*it)->get(); 
    } 
    return result; 
} 

int main(){ 

    std::vector<A> v(10); 
    std::vector<A*> w(10); 
    std::vector<std::shared_ptr<A>> u(10); 

    for (int i = 0; i < w.size(); i++){ 
     w[i] = new A(); 
    } 

    for (int i = 0; i < u.size(); i++){ 
     u[i] = std::make_shared<A>(); 
    } 

    //sum<int>(v.begin(), v.end()); //doesn't work 

    sum<int>(w.begin(), w.end()); 
    sum<int>(u.begin(), u.end()); 
} 
+1

像標準庫一樣做,並採用開始和結束迭代器並處理範圍'[begin,end]'。 – NathanOliver

+0

將算法包裝成模板函數。 –

+0

@πάνταῥεῖ你可以擴展嗎?我看不出如何使用相同的模板作爲指針和對象。在模板函數中,我需要T> getSomething()或T.getSomething(),對嗎? – Utka

回答

0

您可以實現你的算法使用模板函數。這裏給出了模板函數的示例。

template<typename T> 
return_type functionName(vector<T> var) { 
    // You can do this multiple way, First approach 
    T sum = T(); 
    for(const auto& it: var) { 
     sum += it; 
    } 
    // 2nd Approach 
    for(int i = 0; i < var.size(); i++) { 
     sum += var[i]; 
    } 
} 

有關模板的詳細信息和它的使用,請閱讀An Idiot's Guide to C++ Templates - Part 1An Idiot's Guide to C++ Templates - Part 2

+0

通過引用傳遞向量比通過值傳遞可能更好。 –

+0

專門用於'std :: vector'。我懷疑這是OP中的意圖。 –

+0

感謝您的答案,但它模板我的類型,我寧願儘可能保持某種方式,但不適用於對象與指針這是我的問題。 – Utka

0

功能的邏輯是獨立於它是物體的向量,生對象的指針或唯一/弱/共享指針。

的慣用做法是包裝這樣的算法轉換爲模板的功能,即採用迭代模板參數:

template<typename T, typename Iterator> 
T sum(Iterator begin, Iterator end) { 
    T result = {}; 
    for(auto it = begin; it != end; ++it) { 
     result += *it; 
    } 
    return result; 
} 

下面介紹幾種方法來使用它

std::vector<int> v { 1, 2, 3, 4, 5 }; 
int sum1 = sum<int>(v.begin(),v.end()); 

std::array<int, 5> a { 1, 2, 3, 4, 5 }; 
int sum2 = sum<int>(a.begin(),a.end()); 

int ra[5] { 1, 2, 3, 4, 5 }; 
int sum3 = sum<int>(std::begin(ra),std::end(ra)); 

int* da = new int[5] { 1, 2, 3, 4, 5 }; 
int sum4 = sum<int>(da,da+5); 

Live Demo

+0

謝謝,這適用於不同類型的指針,但不適用於指針vs對象。另外,如果可能的話,我寧願保留我的對象類型,因爲模板類型迫使我放棄了泛型類型。 – Utka

+0

我編輯了我的答案以包含部分代碼,你介意看看嗎? – Utka