C ++中的模板代码块?

时间:2013-06-02 13:35:26

标签: c++ templates block

最近我正在开发一个项目,需要很多结构,如“重复”和“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 ++版本中实现类似的东西的任何变通方法吗?

2 个答案:

答案 0 :(得分: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; });

答案 1 :(得分:1)

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

所以你的repeat函数可能是这样的:

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

上述功能可以用作

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

上面的调用会导致lambda被调用十次,因此会打印"hello"十次。