gpt4 book ai didi

c++ - 自动迭代器引用的 C++98 等价物是什么?

转载 作者:行者123 更新时间:2023-11-30 00:48:05 25 4
gpt4 key购买 nike

我的开发环境有 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 中尝试做的是迭代器 reference 的等价物(或者说“取消引用的迭代器”更准确?),如下所示:

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;
. . .
}

...但我真的希望这不是答案。

for (auto& it : vec) 的 C++98 等价物是什么,还是不可能?是否只能“模拟”它但取消引用迭代器并在每次迭代时创建一个拷贝?

如果是这样的话,这就是 C++11 auto& 语法“幕后”发生的事情吗? (我不得不相信这不是不是这种情况。)无论如何,使用for (auto& it : vec)for (auto它:vec)?

预先感谢您的见解。

最佳答案

这在 C++ 98 之前已经完成,我最喜欢的解决方案是 Niebler 的 Conditional Love: FOREACH Redux

要体验执行此操作所涉及的“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();
}

As the name "auto_any" suggests, this is a general mechanism for putting an object of unknown type in automatic storage (i.e. it is not dynamically allocated using new).

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

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

链接中有工作代码(阅读本文时还有很多很多需要消化的代码)

关于c++ - 自动迭代器引用的 C++98 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com