簡體   English   中英

boost :: transform_iterator和boost :: bind

[英]boost::transform_iterator and boost::bind

我想將boost :: transform_iterator與boost :: bind一起使用以返回成員函數的結果。

例如

class Foo
{
public:
//...
Bar& getBar();
const Bar& getBar() const;
};

我有一個一元Function對象來選擇getBar()函數

struct getBar: public std::unary_function<Foo&,Bar&>
{
  getBar::result_type operator()(getBar::argument_type arg ) const {
    return arg.getBar()
  }
};

並說我已經使用tranform_iterator這樣在std :: vector和Im中存儲了幾個Foo對象

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 :: function的解決方案是一個不錯的開始,但我並不完全滿意,因此做了一些實驗,並研究了boost :: mem_fn的返回類型

typedef 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。

boost::transform_iterator<boost::function<Bar&(Foo&)>,std::vector<Foo>::iterator>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM