什么是C ++ 98等效的自动迭代器引用?

时间:2015-10-01 23:23:24

标签: c++ c++11 c++98

我的开发环境有RHEL 5.8,它不支持GCC 4.8+现代(C ++ 11 +)编译器。我预计有一天我们会到那里,所以我有一个头文件,我根据C ++ 11支持级别定义宏,所以我可以这样做:

#if defined(CPP11_auto_type_inference) && defined(CPP11_range_based_for_loops)
  for (auto vit : args)
#else
  std::vector<std::string>::const_iterator vit, vend;
  for (vend=args.end(),vit=args.begin(); vit != vend; ++vit)
#endif
  { // process arguments...
    std::cout << "Processing \"" << *vit << '"' << std::endl;
    . . .
  } // end "process arguments" loop

所以,我在C ++ 98中尝试做的事情相当于迭代器引用(或者更准确地说是&#34;一个解引用的迭代器&#34 ;?),如下所示:

for (auto& it : args)
  std::cout << "Processing \"" << it << '"' << std::endl;

对于我的生活,我无法弄清楚如何在C ++ 98中获得一个解除引用的迭代器(或迭代器引用)。我可以模拟,如下所示:

#if defined(CPP11_auto_type_inference) && defined(CPP11_range_based_for_loops)
  for (auto& it : args) {
#else
  std::vector<std::string>::const_iterator vit, vend;
  for (vend=args.end(),vit=args.begin(); vit != vend; ++vit) {
    std::string it(*vit);
#endif
    std::cout << "Processing \"" << it << '"' << std::endl;
    . . .
  }

...但我希望不是答案。

什么是{+ 1}}的C ++ 98等价物,或者它不可能?是否只能模拟&#34;模拟&#34;但它解除引用迭代器并在每次迭代时创建一个副本?

如果是这样的话,那就是正在发生的事情&#34;在掩护下&#34;使用C ++ 11 for (auto& it : vec)语法? (我必须相信这不是的情况。)无论如何,使用auto&比使用for (auto& it : vec)成本更高吗?

提前感谢您的见解。

2 个答案:

答案 0 :(得分:3)

我认为你在模拟C ++ 11功能方面遇到了太多麻烦。您现在可以使用C ++ 98/03方法。当您能够使用C ++ 11编译器时,它们将继续工作。

话虽如此,你可以使用:

#if defined(CPP11_auto_type_inference) && defined(CPP11_range_based_for_loops)
  for (auto vit : args)
#else
  std::vector<std::string>::const_iterator viter, vend;
  for (vend=args.end(),viter=args.begin(); viter != vend; ++viter)
  {
     std::string vit = *viter;
#endif
     { // process arguments...
       std::cout << "Processing \"" << vit << '"' << std::endl;
       . . .
     } // end "process arguments" loop
#if defined(CPP11_auto_type_inference) && defined(CPP11_range_based_for_loops)  
#else
  }
#endif

如果你想模仿

的等价物
  for (auto& vit : args)

你可以使用:

     std::string const& vit = *viter;

答案 1 :(得分:3)

以前在C ++ 98中已经完成了,我最喜欢的解决方案是Conditional Love: FOREACH Redux中的Niebler's

要了解执行此操作所涉及的“hackery”,请查看如何定义“auto_iterator”

struct auto_any_base {};

template< class T > struct auto_any :
auto_any_base
{
   auto_any( T const & t ) : item( t ) {}
   mutable T item;
};

template< class Container >
auto_any< typename Container::const_iterator >
begin( Container const & c )
{
   return c.begin();
}
  

正如名称“auto_any”所暗示的,这是将未知类型的对象放入自动存储的一般机制(即,它不是使用new动态分配的。)

现在,为了(开始创建)FOREACH宏,我们可以说:

#define BOOST_FOREACH( item, container ) \
   auto_any_base const & iter = begin( container ); \ 

链接中有工作代码(很多,很多,在阅读时会更多地消化)