ページ 1 / 1
ループ関数を作りたい
Posted: 2011年7月04日(月) 22:20
by YYSS
C++で「何回ループする」っていう引数をいれるだけでループしてくれる関数を作りたいのです。
理想は
コード:
int a = 0;
Loop(10){
a++;
}
//結果a=10になる
for文やWhileだと、毎回変数を用意しないといけなく、面倒ではないのですが、手軽にループを行いたいと思い、ふと考えました。
今考えたのが
コード:
//宣言
bool Loop( int count ){
static int a = 0;
if( a == count ){
a = 0;
return false;
}
else{
a++;
}
}
//使うとき
int b = 0;
while( Loop(10) ){
b ++;
}
一応理想には近づいたのですが、完全に理想通りの関数を作ることは出来るのでしょうか?
アドバイスをいただけると幸いです
Re: ループ関数を作りたい
Posted: 2011年7月04日(月) 22:30
by h2so5
この設計だとループをネストしたとき、
全てのループで static int a の数値を共有することになってしまいますよ。
breakで抜けた時も a がリセットされません。
Re: ループ関数を作りたい
Posted: 2011年7月04日(月) 22:33
by h2so5
一応こんな手もあったり...
コード:
#define Loop(num) for(int _i=0;_i<num;_i++)
Re: ループ関数を作りたい
Posted: 2011年7月04日(月) 23:09
by box
ぱっと見、C/C++のコードに見えそうもないところがちょっとイヤだったりする私…。
Re: ループ関数を作りたい
Posted: 2011年7月04日(月) 23:15
by Dixq (管理人)
あまりそのような処理はするべきではないと思います。
関数名から見ても、中でLoopしているわけではありませんし。しいて言うならProcessCounter?
その関数は一度使ったら二度と再利用出来ませんし、二重に使いたい時も他に影響してしまいます。
ポインタ引数を持たせればいいでしょうが、それなら結局素直にforに変数iを用意した方が自然です。
C++であれば、for文の中で変数が宣言出来ます。
for( int i=0; i<10; i++ ){
}
スコープは括弧の中だけなので、こちらの方が関数を作るよりスマートだと思います。
世間一般的に書かれている書き方に慣れておいた方がオープンソースを読む時も、人にコードを見せる時も楽だと思いますよ。
Re: ループ関数を作りたい
Posted: 2011年7月04日(月) 23:37
by YYSS
色々な意見をありがとうございます
h2so5 が教えてくださった。
コード:
#define Loop(num) for(int _i=0;_i<num;_i++)
というマクロを作れば理想どおりになりました。
でも、世間一般的に書かれている方法で書くのが一番分かりやすいと言われて、
自分が書きやすいソースにするか、他人が読みやすいソースにするか・・・
難しいですね
とりあえず、自分の中でもう少し考えてみたいと思います。
回答ありがとうございました!!
Re: ループ関数を作りたい
Posted: 2011年7月04日(月) 23:38
by a5ua
マクロを使うか、もしくは
以下のように、ループ回数と関数ポインタ(or 関数オブジェクト)を受け取る関数を作るかですかね。
C++0xであれば、ラムダ式が使えます
コード:
template <typename F>
void loop(int n, const F &f)
{
for (int i = 0; i < n; ++i) {
f();
}
}
int main()
{
int a = 0;
loop(10, [&a] {
++a;
});
}