![](/img/trans.png)
[英]boost::transform_iterator doesn't work with std::bind( &Pair::first, _1 )?
[英]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.