2

我有一个 Visual Studio 2008 C++03 项目,我想在其中使用一个boost::function对象来设置指针的值。像这样的东西:

boost::function< void( int* ) > SetValue;
boost::function< int*() > GetValue;

int* my_value_;
SetValue = boost::bind( my_value_, _1 ); // how should this look?
GetValue = boost::bind( my_value_ ); // and this?

int v;
SetValue( &v );
assert( my_value_ == &v );

int* t = GetValue();
assert( t == my_value_ );

有没有办法做到这一点,或者我需要一个中间函数,比如:

void DoSetValue( int* s, int* v ) { s = v; };
SetValue = boost::bind( DoSetValue, my_value_, _1 );

谢谢

4

3 回答 3

2

使用 Boost.Lambda 库:

#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>

int main()
{
    boost::function<void(int*)> SetValue = (boost::lambda::var(my_value) = boost::lambda::_1);
    boost::function<int*()> GetValue = boost::lambda::var(my_value);
}

您可以在其文档中找到有关使用变量的更多信息。

于 2012-05-23T19:31:27.803 回答
1

您的第一次尝试不会像bind()需要的函数(或函子)那样工作,但是您正在传递一个数据指针,因此您需要提供一个函数来完成您所寻求的工作。

注意:如果你使用 C++11,你可以使用 lambdas,以避免创建一个命名函数

注意:您需要取消引用中的指针DoSetValue或使用引用(在这种情况下,您还需要更改的声明SetValue)-否则更改将在函数调用之外不可见

void DoSetValue( int& s, int& v ) { s = v; }; 
于 2012-05-23T18:44:24.620 回答
0

为了bind以这种方式工作,您需要一个指向operator=( int* ). 当然,没有这样的东西,所以你需要一个中间函数。

如果您可以使用lambdaor phoenix,则有一些方法可以创建一个函数对象,将某些东西分配给其他东西。这取决于您使用的库,但看起来有点像这样:

bl::var( my_value_ ) = bl::_1;
于 2012-05-23T18:44:29.853 回答