手工制作的自动模板(不使用C++ 0x)

k06*_*06a 8 c++ templates c++11

如何在不使用c ++ 0x标准的情况下实现auto关键字功能?

for(std::deque<std::pair<int, int> >::iterator it = points.begin();
    it != points.end(); ++it)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

也许这样的课:

class AUTO
{
public:
   template <typename T1>
   AUTO(T1);

   template <typename T2>
   operator T2();
};
Run Code Online (Sandbox Code Playgroud)

有了这样的用法:

for(AUTO it = points.begin(); it != points.end(); ++it)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

但是,T1和T2是不同的.如何将关于T1的信息移动到运营商T2()?真的有可能吗?

dir*_*tly 12

如果可以轻松实现库扩展,则不需要语言扩展.有关自动提案的详细信息,请参阅N1607.

但是,关于Boost.Foreach文章(哪种做你想要的)宏可能有助于理解与这种实现相关的问题.

什么是BOOST_FOREACH?

在C++中,编写迭代序列的循环是单调乏味的.我们可以使用迭代器,这需要相当数量的样板,或者我们可以使用std :: for_each()算法并将我们的循环体移动到谓词中,这需要不少的锅炉板并迫使我们移动我们的远离它将被使用的逻辑.相比之下,其他一些语言,如Perl,提供了一个专用的"foreach"结构,可以自动执行此过程.BOOST_FOREACH就是这样的C++构造.它为我们迭代序列,使我们不必直接处理迭代器或编写谓词.

BOOST_FOREACH旨在提高易用性和效率.它不进行动态分配,不进行虚函数调用或通过函数指针调用,也不进行对编译器优化器不透明的调用.这导致近乎最佳的代码生成; BOOST_FOREACH的性能通常在等效手动编码循环的几个百分点内.尽管BOOST_FOREACH是一个宏,但它是一个表现非常好的宏.它只对其论点进行一次评估,不会产生令人讨厌的意外.

  • @ k06a:当C++可以在库中实现时,C++中强烈反对将某些东西作为一种新的语言特性实现.因此,如果某些内容以适当的语言结束,您可以非常确定没有人找到在库中正确执行此操作的方法.(例如,`std :: function`和`std :: bind` do是在许多其他语言的语言中构建的,但它是C++中的库特性.) (4认同)

Kor*_*icz 10

有一个BOOST_AUTO宏,它或多或少地做了auto关键字...但是,看一下它的实现会告诉你,找到一种使用C++ 0x的方法要好得多:>