1
我想使用boost :: transform_iterator和boost :: bind來返回成員函數的結果。boost :: transform_iterator和boost :: bind
例如
class Foo
{
public:
//...
Bar& getBar();
const Bar& getBar() const;
};
我有一個一元函數對象來選擇getBar()函數
struct getBar: public std::unary_function<Foo&,Bar&>
{
getBar::result_type operator()(getBar::argument_type arg) const {
return arg.getBar()
}
};
,並可以說,我已經儲存了多富一個std :: vector的內部對象,並使用我是個tranform_iterator像那
int main()
{
typedef std::vector<Foo> VEC;
typedef boost::transform_iterator<getBar,VEC::iterator> iterator;
VEC vec;
vec.push_back(Foo());
iterator i(vec.begin());
//...
Bar = *i;
return 0;
};
但是,如果我想使用boost :: bind而不是getBar仿函數我會怎麼做。我不確定我必須將哪個模板參數傳遞給transform_iterator。
編輯:
與升壓::功能的解決方案是一個很好的開始,但我並不完全滿意,所以嘗試了一下,看着返回類型爲boost ::的
的mem_fntypedef boost::transform_iterator<boost::_mfi::mf0<Bar&,Foo>,VEC::iterator> iter;
typedef boost::transform_iterator<boost::_mfi::cmf0<const Bar&,Foo>,VEC::const_iterator> citer;
但是這個解決方案有另一個問題 因爲
iter i(v.begin(), boost::mem_fn(&Foo::getBar));
citer ci(v.begin(), boost::mem_fn(&Foo::getBar));
導致以下錯誤
call of overloaded mem_fn(<unresolved overloaded function type>) is ambiguous
編譯器無法識別哪個getBar功能要求,我必須幫助他一點點。
iter i(v.begin(), boost::mem_fn(static_cast<Bar& (Foo::*)()>(&Foo::getBar)));
citer ci(v.begin(), boost::mem_fn(static_cast<const Bar& (Foo::*)() const >(&Foo::getBar)));
這可能不會比手動編寫一個函數更快,但至少它幫助我更好地理解boost :: mem_fn。
可能是錯字?我認爲你的意思是'Bar&(Foo&)' – 2011-03-08 18:23:53
@Ise:正確!謝謝; P – 2011-03-09 10:11:39
太好了。但是在使用'boost :: function'時不會有性能損失? – 2011-03-09 10:19:33