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