我想将实现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}}是正确的数字?
答案 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();
}