簡體   English   中英

C ++循環巨集

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM