2016-07-13 4 views
-4

私は、開始点が終了点より小さくても大きくても、次のようなものかどうかを推測することによって動作する短いfor-loop(マクロ有り無し)を書いておきたいと思います。for C++ for short short syntax

fr(i = 0 .. 3) printf("%d ", i) 
    output: 0 1 2 3 

fr(i = 8 .. 3) printf("%d ", i) 
    ouput: 8 7 6 5 4 3 

fr(i = 3 ..< 6) printf("%d ", i) 
    output: 3 4 5 

fr(i = 5 ..> 1) printf("%d ", i) 
    output: 5 4 3 2 

簡単に言えば、私は簡単な方法で強力なものを書いていきたいと思います...これは可能ですか?

そうでない場合、別の方法がありますか?

+0

'cout << iは' printf'よりも少ない入力しか必要としません。 –

+1

マクロにインライン関数を使用することを推奨します。マクロは悪です。 –

+0

私はコードを書く必要はありません。それは私のためのものです。 – Daniel

答えて

1

これは、あなたが期待したものに非常に近いです。

#include <iostream> 
#include <algorithm> 

#define LT -1 + 
#define GT 1 + 
#define FR(type, var, from, to) for(type dir = (from < to)? 1: -1, i = from; i != to + dir; i += dir) 

int main() { 
    FR(int, i, 0, 3) std::cout << i << " "; 
    std::cout << std::endl; 

    FR(int, i, 8, 3) std::cout << i << " "; 
    std::cout << std::endl; 

    FR(int, i, 3, LT 6) std::cout << i << " "; 
    std::cout << std::endl; 

    FR(int, i, 5, GT 1) std::cout << i << " "; 
    std::cout << std::endl; 
} 
+0

すてきな解決策、唯一欠けている...それを挿入する方法はありますか? (私はいつもintを使用しているので、型は必要ありません) – Daniel

+0

@Daniel:おそらく、ループの本体を関数のパラメータとして取る必要があります。 (問題は、ループインデックス名を知る必要があります。ネストされたループが必要なので、 'i'だけではありません。)あるいは、オーバーロードされた' operator =() '型を導入します。あなたの考えをしないでください。 – lorro

0

あなたはすべての値が整数であると仮定すると、このような何かがうまく動作するかもしれません:

#define MYFOR(i,a,b) for (int i = (a); i != (b); i = (a)<(b)? i+1 : i-1) 

次に使用がこの方法です:

MYFOR(i, 0, 10) printf("%d ", i); 
MYFOR(i, 5, 0) printf("%d ", i); 
+0

私はすでにこれについて考えていましたが、問題は=ステートメントです... – Daniel

+0

@Daniel:なぜ '= 'ステートメントが問題なのか分かりません...試してみました。あなたはマクロを使用するときを意味しますか?その後、それを書かないでください。 – rodrigo

関連する問題