1

最近我在做一个项目,它需要很多结构,比如“repeat”和“foreach”。我知道 C++ 中没有这样的结构,但我试图想象它们会是什么样子。

repeat(count)
{
   ...
}

foreach(someList, it)
{
   ...
}

由于 C++ 中已经支持模板内联函数,因此只需很少的更改即可支持模板代码块。一种可能的语法可能是这样的:

template<unsigned count> repeat(unsigned count)
while(count--) __code;

template <class ContainerT, typename ContainerT::iterator it>
foreach(ContainerT& cn, typename ContainerT::iterator it)
    for(typename ContainerT::iterator it=cn.begin(); it!=cn.end(); ++it) __code;

您如何看待这种语法?在未来的 C++ 版本中是否有机会添加此类功能?您是否知道在当前 C++ 版本中实现此类功能的任何解决方法?

4

2 回答 2

3

在未来的 C++ 版本中是否有机会添加此类功能?

C++11 有基于范围的for循环:

for (auto elem : cont) // (perhaps use auto&, auto const&, or auto&&,
                       //  depending on your use case)
{
    // Do what you want with elem...
}

或者,您可以使用std::for_each()lambda:

std::for_each(cont.begin(), cont.end(), 
    [&] (decltype(cont)::value_type const& elem)
//                                  ^^^^^^
//                                  Or whatever fits your needs
{
    // Do what you want with elem...
}

此外,Boost.Range具有允许处理范围而不是迭代器对的 C++ 标准算法版本:

#include <boost/range/algorithm.hpp>

// ...

std::vector<int> v = { 1, 2, 3 };
boost::for_each(v, [] (int i) { std::cout << i * 2 << std::endl; });
于 2013-06-02T13:38:24.557 回答
1

与其拥有适当的循环体,不如看看 C++ 标准库是如何做到的:它使用“谓词”作为类似函数的参数,这些可以是任何可调用对象(函数指针、静态成员函数指针、仿函数对象、和(自 C++11 起)std::function对象、std::bind表达式或lambda 表达式)。

所以你的repeat功能可能是这样的:

template<typename Tpred>
void repeat(unsigned count, Tpred predicate)
{
    while (count--)
        predicate();
}

上面的函数可以用作

repeat(10, [](){ std::cout << "hello\n"; });

上面的调用会导致 lambda 被调用十次,所以它会打印"hello"十次。

于 2013-06-02T13:40:16.663 回答