将赋值运算符绑定到boost :: function对象

时间:2012-05-23 18:40:58

标签: c++ boost-bind

我有一个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 );

由于

3 个答案:

答案 0 :(得分: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);
}

您可以找到有关使用变量in its documentation的更多信息。

答案 1 :(得分:1)

您的第一次尝试不起作用,因为bind()需要一个函数(或仿函数),但是您传递的是数据指针,因此您需要提供一个能够完成您所寻找的工作的函数。

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

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

void DoSetValue( int& s, int& v ) { s = v; }; 

答案 2 :(得分:0)

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

如果您可以使用lambdaphoenix,则有一些方法可以创建一个函数对象,以便为其他东西分配内容。这取决于您使用的库,但它看起来有点像这样:

bl::var( my_value_ ) = bl::_1;