获取ostream模板以在指针列表中打印实例属性

时间:2013-07-08 23:43:21

标签: c++ list iterator ostream

我正在尝试使用模板函数来打印列表中指向的对象的属性。

class SomeClass {
  public:
   double myVal;
   int myID;
}

std::list< boost::shared_ptr< SomeClass > > myListOfPtrs;
for ( int i = 0; i < 10; i++ ) {
  boost::shared_ptr< SomeClass > classPtr( new SomeClass );
  myListOfPtrs.push_back( classPtr );
}

template < typename T > void printList ( const std::list< T > &listRef ) {
  if ( listRef.empty() ) {
    cout << "List empty.";
  } else {
    std::ostream_iterator< T > output( cout, " " ); // How to reference myVal near here?
    std::copy( listRef.begin(), listRef.end(), output ); 
  }
}

printList( myListOfPtrs );

打印的是指针地址。我知道我通常做的是(*itr)->myVal,但我不清楚如何调整模板功能。

1 个答案:

答案 0 :(得分:0)

首先,请勿在此处使用shared_ptr。您的代码没有给我们任何使用内存管理的理由:

std::list<SomeClass> myListofPtrs;

然后,您需要为您的类提供自己的流插入运算符实现:

std::ostream& operator <<(std::ostream& os, SomeClass const& obj)
{
    return os << obj.myVal;
}

如果你必须使用指针,那么你可以创建自己的循环:

for (auto a : myListOfPtrs)
{
    std::cout << (*a).myVal << " ";
}