C++ C+中的模板代码块+;?

C++ C+中的模板代码块+;?,c++,templates,block,C++,Templates,Block,最近我在做一个项目,它需要很多构造,比如“repeat”和“foreach”。我知道C++中没有这样的构造,但我试着想象它们可能是什么样子。 repeat(count) { ... } foreach(someList, it) { ... } 因为C++中已经支持模板内联函数,所以支持模板代码块也不需要太多的改变。可能的语法之一如下所示: template<unsigned count> repeat(unsigned count) while(count--) _

最近我在做一个项目,它需要很多构造,比如“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;
template<typename Tpred>
void repeat(unsigned count, Tpred predicate)
{
    while (count--)
        predicate();
}
模板重复(无符号计数)
而(计数--)uu码;
样板
foreach(ContainerT&cn,类型名ContainerT::iterator it)
对于(typename ContainerT::iterator it=cn.begin();it!=cn.end();++it)代码;
你觉得这个语法怎么样?在将来的C++版本中有没有添加这种特性的机会?你知道在当前C++版本中实现这种方法的任何方法吗?

有没有可能在将来的C++版本中添加这样的特性?

C++11对循环具有基于范围的

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

还有,允许在范围上而不是在迭代器对上工作的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; });
#包括
// ...
向量v={1,2,3};
boost::for_each(v,[](int i){std::cout

有没有可能在将来的C++版本中添加这样的特性?

C++11对
循环具有基于范围的

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

还有,允许在范围上而不是在迭代器对上工作的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; });
#包括
// ...
向量v={1,2,3};

Foo::FuyOn[{[INT]{STD::CUT

)而不是为循环有适当的主体,看看C++标准库是如何做到的:它使用“谓词”作为参数,类似函数,这些可以是任何可调用对象(函数指针、静态成员函数指针,和(因为C++ 11)对象、表达式或)//P> 因此,您的

repeat
函数可以是这样的:

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;
template<typename Tpred>
void repeat(unsigned count, Tpred predicate)
{
    while (count--)
        predicate();
}
模板
void repeat(无符号计数,Tpred谓词)
{
而(计数--)
谓词();
}

上述功能可用作

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

<代码>重复(10,[]):STD::CUT< P>而不是为循环有适当的主体,看看C++标准库是如何做到的:它使用“谓词”作为参数,以类似的函数,这些可以是任何可调用对象(函数指针、静态成员函数指针和(因为C++ 11)对象、表达式或)//P> 因此,您的
repeat
函数可以是这样的:

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;
template<typename Tpred>
void repeat(unsigned count, Tpred predicate)
{
    while (count--)
        predicate();
}
模板
void repeat(无符号计数,Tpred谓词)
{
而(计数--)
谓词();
}

上述功能可用作

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

重复(10,[](){STD::CUT中有一个C++ 11,并且这两个函数很容易实现。顺便说一下,C++已经有很多年了。这只是两个例子。我并不意味着我绝对需要重复和FoeCH。我不知道为什么没有模板代码块,它可以将C++ C++移到一个新的层次。dpoint,编译器在内联模板函数和模板代码块之间没有什么区别。不,标准库通过使用模板化的“谓词”对象来解决这个问题。例如,请参阅我前面评论中链接的
std::for_each
引用。当然,也可以参阅我的答案。:)在C++中有一个C++,11个C++,这两个函数很容易实现。顺便说一下,C++已经有很多年了。这只是两个例子。我并不意味着我绝对需要重复和FoeCH。我不知道为什么没有模板代码块,它可以把C++移到一个新的层次。对于编译器来说,内联模板函数和模板代码块之间的差别很小。不,标准库通过使用模板化的“谓词”对象来解决这个问题。例如,请参阅
std::for_我前面的注释中链接的每个
引用。当然也可以参阅我的答案。:)我从来没有在我的项目中使用过boost,但感谢您的提示。我仍然希望从更广泛的角度来回答这个问题。这不是一个关于repeat/foreach的问题。这是一个关于代码模板块的问题。我从来没有在我的项目中使用过boost,但感谢您的提示。我仍然希望从更广泛的角度来回答这个问题从更广泛的角度来看这个问题。这不是一个关于repeat/foreach的问题。这是一个关于一般代码模板块的问题。那么使用这个repeat定义的代码会是什么样子呢?假设我们使用的是C++11?@bkxp添加了一个简单的示例。如果你想向lambda传递更多参数,那么你可以使用
std::bind
来传递任意参数。说真的,[](){?将其与代码块模板进行比较:重复(10){STD::CUTH-BKXP——C++是如何指定的。除非你想编写自己的编译器并将它作为扩展来添加,否则根本不可能做你想要的,但是它不再是C++,而是一种完全基于C++的新语言。你要么必须与你所拥有的生活在一起,要么工作在那些限制中,要么找到(或制造)。其他的东西可以做你想做的事情。通过你的逻辑C++ 11不再是C++,因为它引入了lambda函数和其他新的东西。但是我认为这不是标准的最新版本,也许在C++ 14中我们会看到更多的特性。现在我们不能讨论可能的特征吗?顺便说一下,QT必须引入预处理器BeAuu。se缺少一些功能。这当然是一个难题,但使用模板代码块他们就不必这么做。从头开始编写编程语言比扩展现有语言更复杂。那么使用此重复定义的代码会是什么样子?假设我们使用的是C++11?@bkxp添加了一个简单的示例。如果你