我的开发环境有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)
成本更高吗?
提前感谢您的见解。
答案 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 ); \
链接中有工作代码(很多,很多,在阅读时会更多地消化)