2013-05-08 35 views
2

我有一個元素容器,每個元素都有它的size()成員函數。我設法通過編寫一個二元運算add_size累積總容器元素的大小:如何僅使用Element成員函數和STL從容器中的元素的成員函數累積結果?

#include <algorithm> 
#include <vector> 
#include <functional> 
#include <numeric> 
#include <iostream> 

class A 
{ 
    int size_ ; 

    public: 

     A() 
      : 
       size_(0) 
     {} 

     A (int size) 
      : 
       size_(size) 
     {} 

     int size() const 
     { 
      return size_; 
     } 
}; 

template<typename Type> 
class add_element 
{ 
    Type t_; 

    public: 

     add_element(Type const & t) 
      : 
       t_(t) 
     {} 

     void operator()(Type & t) 
     { 
      t += t_; 
     } 
}; 

int add_size (int i, const A& a) 
{ 
    return i+=a.size(); 
} 

using namespace std; 

int main(int argc, const char *argv[]) 
{ 

    typedef vector<A> Vector; 

    Vector v; 

    v.push_back(A(10)); 
    v.push_back(A(5)); 
    v.push_back(A(7)); 
    v.push_back(A(21)); 
    v.push_back(A(2)); 
    v.push_back(A(1)); 

    int totalSize = accumulate(v.begin(), v.end(), 0, add_size); 

    std::cout << totalSize << endl; 

    return 0; 
} 

這給正確的輸出:

46 

什麼,我想是這樣做沒有確定二進制運算add_size僅用於size成員函數,但是使用了mem_fun和binders。我怎樣才能做到這一點?我該怎麼做?我開始與add_element卡住了。

我需要解決方案在C++ 03中工作。

+0

boost :: lambda? – ForEveR 2013-05-08 10:01:10

+0

@ForEveR是C++ 11,對不對?我需要解決方案來使用C++ 03。代碼在具有舊編譯器的羣集上運行。 – tmaric 2013-05-08 10:01:46

+2

boost!= C++ 11。 http://www.boost.org/ – ForEveR 2013-05-08 10:02:24

回答

2

我相信你的問題是病態。看看你有什麼:一個小單線功能add_sizestd::accumulate的呼叫。 不喜歡什麼?

你都弄好了(或許爲企業原因)來自使用Boost.Bind或Boost.Lambda限制,更不用說C++ 11(這兩個標準化和std::bind lambda表達式)。

你想消除有利於C++ 03粘合劑這是在它們的表現(這是BTW原因之一Boost.Bind和Boost.Lambda是很普遍),並需要更多可怕的有限比你目前擁有的樣板。看看C++ Standard Reference book by Nicolai Jusuttisappendix。他實現了一個通用的compose模板,該模板與std::bind2nd和朋友「很好地」工作。但是看看他使用哪些標題來實現它:正確的是,Boost.Bind。

你最好的方法是簡單地複製和Boost.Bind /或Boost.Lambda,讓他們在自己的源代碼樹,並重新命名的命名空間到你的公司的。檢查它是否與Boost License一致。 Boost甚至有一個bcp工具來爲你提取所有包含的依賴關係。然後,只需使用您剛剛「書寫」的綁定或lambda設施即可編寫所需的任何內容。

TL; DR:不要重新發明輪子。熟悉Boost。

+0

我完全沒有反對熟悉Boost,並且我不知道故事的背景,因爲我缺乏經驗。感謝您提供對問題的洞察! +1 – tmaric 2013-05-08 13:02:06

+0

@ tomislav-maric很高興有幫助。 「熟悉Boost」字面上是優秀書的第55項[** Effective C++ **](http://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876),a [**必須閱讀**](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)如果你想擴大你的經驗。 – TemplateRex 2013-05-08 13:05:42

+0

:)我讀過那本書......並且更有效,現在我正在閱讀有效的STL ......我知道提升效果有多重要,並且我對新標準帶來了什麼感受。我的問題是,代碼將在舊版編譯器上的hpc集羣上執行,所以C++ 11是不可能的,我無法知道哪些增強版本在這些機器上生存,所以我很擔心。 .. – tmaric 2013-05-08 13:07:23

相關問題