2011-07-04 65 views
1

我在寫一個小例子來試圖理解boost :: signal的多個返回值。但是,結果似乎讓我感到厭煩。用min_element提升信號

#include <boost/signal.hpp> 
#include <iostream> 
#include <algorithm> 

int func1() 
{ 
    return 3; 
} 

int func2() 
{ 
    return 4; 
} 

int func3() 
{ 
    return 2; 
} 

template <typename T> 
struct min_element 
{ 
    typedef T result_type; //result_type is required by boost::signal 

    template <typename InputIterator> 
    T operator()(InputIterator first, InputIterator last) const 
    { 
     std::cout<<*std::min_element(first, last)<<std::endl; //I got 3 here 
     return T(first, last); 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    boost::signal<int(), min_element<std::vector<int> > > s; 
    s.connect(func1); 
    s.connect(func2); 
    s.connect(func3); 
    std::vector<int> v = s(); 
    std::cout<<*std::min_element(v.begin(),v.end())<<std::endl; //I got 2 here 
    return 0; 
} 

第一個min_element會輸出「3」,而第二個會輸出「2」。顯然,「2」是這三者中最小的一個。我不知道第一個有什麼問題。在運算符()中,我也嘗試從第一個到最後一個迭代,我得到了序列「3,4,2」,這似乎是正確的。但爲什麼min_element會給我「3」呢?

該代碼是使用VS2010 SP1編譯的。 Boost的版本是最新版本的1.46.1。

在此先感謝。

邁克爾

回答

0

奇怪。更換operator()

T operator()(InputIterator first, InputIterator last) const 
{ 
    InputIterator result = first; 

    while (++first != last) { 
//  *result; 
     std::cout<<*first<<std::endl; 
    } 

    return T(); 
} 

作品,但只要你解引用resultfirstresult都陷在3這是std::min_element所做的事。我找到了我的實現的源代碼,並將其解壓縮到上面所見的內容。

我不知道發生了什麼事。

這是GCC 4.5.0上的Boost 1.38.0。