2012-05-23 30 views
2

我有一個Visual Studio 2008 C++ 03項目,我想使用boost::function對象來設置指針的值。事情是這樣的:將賦值運算符綁定到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

bind外可見的工作方式,你需要一個指針operator=(int*)。當然,沒有這樣的東西,所以你需要一箇中間功能。

如果你可以使用lambdaphoenix,有一些方法可以創建一個函數對象,將某些東西分配給其他東西。這取決於你使用的庫,但它看起來有點像這樣:

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

boost :: phoenix看起來可能是一個很好的解決方案,但是我很難從文檔中瞭解如何在這種情況下使用它。 例如:'SetValue = boost :: phoenix :: val(my_value_);'在稍後調用SetValue()時似乎不執行任何操作。 – PaulH

+0

嘗試類似'boost :: phoenix :: val(my_value_)= phoenix_placeholder :: _ 1' –

+0

是的,但是我如何獲得函數指針'SetValue'? – PaulH

1

你的第一次嘗試沒有bind()工作需要的功能(或函子),但是你傳遞的是數據指針,所以你需要提供一個函數來完成你所尋找的工作。

:如果您使用C++ 11,你可以使用lambda表達式,以避免創建一個名爲功能

:您需要取消引用指針在DoSetValue或使用引用(在你需要改變的SetValue申報爲好)這種情況下 - 否則的變化會不會是函數調用

void DoSetValue(int& s, int& v) { s = v; }; 
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

+0

嗯,所以*這是*爲什麼賦值運算符從右到左聯繫;-) –

+0

是的,我應該在這個表達式中加上大括號:) –

+0

另外,如果你要使用一個類,你可以綁定到'運算符=',請參閱[本答案](http://stackoverflow.com/a/10573795/13767)。 –