make boost :: function接受对我的函数对象的引用

时间:2014-04-17 16:39:32

标签: c++ boost struct boost-function

我想将实现operator()的结构传递给接受boost::function的函数。该结构记录了它被调用的次数。

struct CallCounter
{
    CallCounter() : count( 0 ) {}
    void operator()()
    {
        // do stuff
        cout << "count is at " << count << endl;
        ++count;
    }

    int count;
};

但是,当我在将count传递给另一个函数后尝试访问count时,void callNTimes( int n, boost::function<void()> func ) { for ( int i = 0; i < n; ++i ) func(); } int main() { CallCounter counter; callNTimes( 20, counter ); cout << counter.count << endl; // prints 0 return 0; } 仍为0。

counter

即使在调用count时,它也会打印出正确的boost::function。我了解struct counter正在制作count的副本。有没有办法通过引用传递它,以便之后,{{1}}是正确的数字?

2 个答案:

答案 0 :(得分:3)

boost function内容默认采用变量值,与普通函数非常相似。如果您希望该函数对CallCounter使用引用,则必须明确告诉它:

callNTimes( 20, boost::ref(counter) );

请在此处查看:http://coliru.stacked-crooked.com/a/5843b6dde685b569

如果你想要一个常量引用,也存在一个boost::cref,但没有boost::rref(它几乎与一个值相同,但是单次使用。function是多用途的,所以没有动作)。此外,从C ++ 11开始,所有这些都在std命名空间中。

此外,如果可能的话,Jefffrey的建议通常被认为是编写此类事物的更好方法。但它可能会对编译时间产生负面影响。

答案 1 :(得分:1)

我看到你正在使用boost::function。实际上这里没有必要,您可以使用模板并通过引用传递仿函数:

template<typename Functor>
void callNTimes( int n, Functor& func )
{
    for ( int i = 0; i < n; ++i )
        func();
}

Live demo