我尝试仅从我的struct(struct pnt)的vector中打印一个struct成员。让我通过展示这一点来说清楚:
struct pnt {
char _name;
int _type;
bool _aux;
};
boost::copy(pntVec.begin(),pntVec.end()|
boost::adaptors::transformed(bind(&pnt::_type, _1)),
std::ostream_iterator<int>(std::cout, "\n"));
但是我收到了错误。如果你能帮我找到原因,我将不胜感激。
错误:
error: no type named ‘type’ in ‘boost::mpl::eval_if_c<true, boost::range_const_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> >, void>, boost::range_mutable_iterator<const __gnu_cxx::__normal_iterator<int*, std::vector<int> >, void> >::f_ {aka struct boost::range_const_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> >, void>}’
注意:我可以使用 C ++ 98,提升v.1.56
答案 0 :(得分:3)
Boost 适配器适应范围,而非单个迭代器。类似地,boost::copy
算法需要两个参数,其中第一个是范围,第二个是输出迭代器。话虽如此,从范围中提取单个数据成员并将其复制到输出迭代器的正确语法是:
boost::copy(pntVec | boost::adaptors::transformed(bind(&pnt::_type, _1))
, std::ostream_iterator<int>(std::cout, "\n"));
答案 1 :(得分:3)
或者,由于Phoenix在某种程度上取代了Boost Bind + Boost Lambda,你可以使用Boost Phoenix:
boost::for_each(pntVec, std::cout << bind(&pnt::_type, arg1) << "\n");
甚至没有bind
,如果你不担心一些神秘的语法:
boost::for_each(v, std::cout << (arg1->*&pnt::_type) << "\n");
那非常富有表现力。见 Live On Coliru
另请注意,Boost / c ++ 11中有mem_fn
:pntVec | transformed(mem_fn(&pnt::_type))