用min_element增强信号

boost signal with min_element

本文关键字:增强 信号 element min      更新时间:2023-10-16

我正在写一个小例子,试图理解boost::信号的多个返回值。然而,结果对我来说似乎很奇怪。

#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。

提前感谢。

迈克尔

奇怪。替换operator():

T operator()(InputIterator first, InputIterator last) const 
{
    InputIterator result = first;
    while (++first != last) {
//      *result;
        std::cout<<*first<<std::endl;
    }
    return T();
}

工作,但一旦你解除参考result, firstresult都被困在3。这就是std::min_element正在做的;我找到了实现的源代码,并将其精简为你在上面看到的内容。

我不知道这是怎么回事。