Недавно, во время кодирования, я обнаружил, что снова повторяю то же самое для заголовка цикла:
for (int i = 0; i < [somevalue]; i++)
{
[other code]
}
Кто-нибудь знает, как перегрузить цикл for, или определить другое ключевое слово, чтобы оно принимало число и подавало его через заданный цикл, чтобы аббревиатура означала следующее:
for ([somevalue])
{
[other code]
}
или
nfor ([somevalue])
{
[other code]
}
Потому что просто писать for(12)
все время и пробивать код через 12 раз было бы намного приятнее
Или, если вы хотите использовать простые старые макросы, можете сделать
#define nfor(somevalue) for(int i = 0; i < somevalue; ++i)
Затем используйте его как
nfor(10)
{
cout << "Hello World " << i << "!" << endl;
}
Вы можете сделать свой собственный for
метода, который принимает объект функции:
template <class F>
void for_t(std::size_t n, F const& f)
{
while (n--)
f();
}
int main()
{
int count = 0;
for_t(5, [&] { std::cout << ++count << " "; });
}
[&count]
предоставляя функции доступ к тем вещам, которые ей не нужны.
Или используя диапазоны (и усиление):
for(int i : boost::counting_range(0, limit))
/* do nice things */ ;
class until {
public:
until(int limit) : count(limit) {}
int operator*() const { return count; }
until &operator++() { ++count; return *this; }
bool operator!=(const until &rhs) const { return count != rhs.count; }
until begin() const { return 0; }
until end() const { return count; };
private:
int count;
};
#include <iostream>
int main() {
for (int count : until(5)) {
std::cout << count << ' ';
}
}
N3853: Диапазоны, основанные на диапазонах, следующее поколение будет делать for
терьера.
Если вам нравится подход к макросам, может быть лучше слегка настроить решение @vsoftco, чтобы включить использование другого имени для переменной управления контуром:
#define nfor(varname, somevalue) for(int varname = 0; varname < somevalue; ++varname)
Таким образом, вы можете иметь вложенные для циклов, используя выше макрос:
nfor(i, 10)
{
nfor(j, 10)
{
cout << i << " " << j;
}
}
Это невозможно в цикле for в C++. Есть два способа сделать то, что вы хотите.
Первое - использовать последнее дополнение к семейству for loop, представленному в C++ 11.
for(int x : (int[12]){}){
// Do stuff
}
Не совсем то, что вы хотите, но все же немного короче. Другой вариант - сделать вашу собственную функцию и позволить ей принимать размер и функцию. 0x499602D2 избили меня в этой части, поэтому см. Их сообщение о том, как это сделать.
Например,
template< class Func >
void repeat( int const n, Func const& f )
{
for( int i = 1; i <= n; ++i ) { f(); }
}
void foo()
{
int n = 1;
repeat( 12, [&]
{
// other code, e.g.
cout << n++ << endl;
} );
}
Отказ от ответственности: код не тронут руками компилятора.
othercode
, вам может быть лучше использовать алгоритмы из стандартной библиотеки C ++, такие какfor_each
илиtransform
.