2016-01-10 81 views
1

該代碼段從比特幣代碼庫中提取。瞭解以下cpp代碼段

struct CombinerAll 
{ 
    typedef bool result_type; 

    template<typename I> 
    bool operator()(I first, I last) const 
    { 
     while (first != last) { 
      if (!(*first)) return false; 
      ++first; 
     } 
     return true; 
    } 
}; 

這被這裏

boost::signals2::signal<bool (CNode*), CombinerAll> ProcessMessages; 

使用的任何C++高手可以幫我瞭解上述(CombinerAllProcessMessages升壓信號)呢?問這個問題是因爲boost庫對我來說非常不直觀。

+2

['boost.signals2'](http://www.boost.org/doc/libs/1_60_0/doc/html/signals2.html)文檔非常好。我會從閱讀開始。 – juanchopanza

回答

2

從功能:

 if (!(*first)) return false; 

如果當指示器/迭代器/對象被解除引用的任何範圍[first, last)的元件的評估爲false,函數返回false。否則,它返回true

實施例的測試代碼:

int main() 
{ 
    std::string sa = "abc"; 

    std::vector<int> va = {1, 1, 1}; 
    std::vector<int> vb = {1, 0, 2}; 

    std::cout << std::boolalpha; 
    std::cout << CombinerAll()(sa.begin(), sa.end()) << std::endl; 

    std::cout << CombinerAll()(va.begin(), va.end()) << std::endl; 
    std::cout << CombinerAll()(vb.begin(), vb.end()) << std::endl; 

    return 0; 
} 

輸出:

boost::signals2::signal
true 
true 
false 

文檔可以在Boost website找到。

至於什麼ProcessMessages這樣做,你必須諮詢編寫該代碼的人。

+0

謝謝你的明確解釋。其實我特別想知道模板行的含義。如果我的理解是正確的,那麼當我們調用CombinerAll時,我們正在重載()運算符並使其進行循環計算? –

+0

@SandhyaKumar,這是正確的。 –