[英]c++ loop macros
我使用宏對展開的循環進行編碼,如下所示:(愚蠢的示例)
#define foreach_small_prime(p, instr) { \
int p; \
p = 2; instr; \
p = 3; instr; \
p = 5; instr; \
p = 7; instr; \
}
foreach_small_prime(pp, cout << pp);
int sum = 0;
foreach_small_prime(pp, {
sum += pp;
if (sum >= 10) cout << sum << endl;
});
但在某些情況下,我可能會使用它來構造:
#define foreach_small_even(ii) for(int ii = 0; ii < 20; ii += 2)
int sum = 0;
foreach_small_even(pp) {
sum += pp;
if (sum >= 10) cout << sum << endl;
}
我喜歡這個宏,因為我可以將變量名作為參數傳遞。
問題:有沒有一種方法可以像第二個宏一樣使用類似於for的語法來定義第一個循環?
您可以簽出Boost 預處理程序庫。 它可以做各種循環的事情。 語法不是很好,但是我相信它可以工作。 但是,我自己沒有使用過它。
您是否有充分的理由避免使用迭代器對象? 您必須考慮將第一個宏粘貼到指令代碼的4倍...
否則,一個簡單的:
#define foreach_smallprime(ii) for(int ii = 0; ii <= 7; ii = next_prime(ii) )
在與宏相同的文件中定義了next_prime(ii)
。
問題:有沒有一種方法可以像第二個宏一樣使用類似於for的語法來定義第一個循環?
我猜您的質數工作集相對較小,因此為質數創建查找不會太麻煩。 如果您需要生成更多的質數列表,我確定Boost庫中提供了一些編譯時模板元編程魔術。 如果您要生成的數字系列比較復雜,將查找轉換為在生成結果時對其進行緩存的函數可能是明智的。
const int small_primes[MAX_SMALL_PRIMES] = {2, 3, 5, 7, 11, 13};
#define foreach_small_prime(pp) \
for (int i = 0; i < MAX_SMALL_PRIMES; pp = small_primes[++i])
用作:
void f() {
int sum = 0;
int temp = 0;
foreach_small_prime(temp) {
sum += temp;
if (sum >= 10) cout << sum << endl;
}
}
可能想扔掉查找表和MAX_SMALL_PRIMES自己的命名空間,以免造成混亂……並且在宏中使用常用的標識符'i'可能不是一個好選擇。 我敢肯定還有其他方法可以改善它,但這基本上就是您所要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.