打印矢量结构的成员

时间:2014-11-21 11:35:49

标签: c++ boost

我尝试仅从我的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

2 个答案:

答案 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_fnpntVec | transformed(mem_fn(&pnt::_type))