P3t*_*rus 1 c++ boost iterator bind transform
我想使用boost :: transform_iterator和boost :: bind来返回成员函数的结果.
例如
class Foo
{
public:
//...
Bar& getBar();
const Bar& getBar() const;
};
Run Code Online (Sandbox Code Playgroud)
我有一个一元的Function对象来选择getBar()函数
struct getBar: public std::unary_function<Foo&,Bar&>
{
getBar::result_type operator()(getBar::argument_type arg ) const {
return arg.getBar()
}
};
Run Code Online (Sandbox Code Playgroud)
并且假设我已经在std :: vector中存储了几个Foo对象,我使用了类似的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;
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我想使用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;
Run Code Online (Sandbox Code Playgroud)
但这个解决方案有另一个问题.因为
iter i(v.begin(), boost::mem_fn( &Foo::getBar ));
citer ci(v.begin(), boost::mem_fn( &Foo::getBar ));
Run Code Online (Sandbox Code Playgroud)
导致以下错误
call of overloaded mem_fn(<unresolved overloaded function type>) is ambiguous
Run Code Online (Sandbox Code Playgroud)
编译器无法识别请求哪个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) ));
Run Code Online (Sandbox Code Playgroud)
这可能不比手工编写一个仿函数快,但至少它帮助我更多地理解了boost :: mem_fn.
boost::transform_iterator<boost::function<Bar&(Foo&)>,std::vector<Foo>::iterator>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1032 次 |
| 最近记录: |