2016-01-10 3 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++ эксперт помочь мне понять, что выше (CombinerAll и ProcessMessages усиление сигнала) делает? Спросите об этом, потому что библиотека 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; 
} 

Выход:

true 
true 
false 

документация для boost::signals2::signal можно найти на Boost website.

Что касается ProcessMessages, вам необходимо обратиться к людям, которые написали этот код.

+0

Благодарим вас за четкое объяснение. На самом деле я хочу знать значение строки шаблона в частности. Если мое понимание верное, мы перегружаем оператор() и делаем его вычислением цикла, когда вызываем CombinerAll как функцию? –

+0

@ SandhyaKumar, это правильно. –