我有一个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 );
由于
答案 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* )
的指针。当然,没有这样的东西,所以你需要一个中间函数。
如果您可以使用lambda
或phoenix
,则有一些方法可以创建一个函数对象,以便为其他东西分配内容。这取决于您使用的库,但它看起来有点像这样:
bl::var( my_value_ ) = bl::_1;