1

私のコードは、テンプレート化された関数を使用するライブラリ (FastLED) を使用します。

#define NUM_WIDGETS 4

Library.function<1>();
Library.function<2>();
Library.function<3>();
Library.function<4>();

テンプレート引数はコンパイル時に計算可能である必要があるため、これを通常の for ループに入れることはできません。プリプロセッサでこれを行うことはできますか? 他の提案はありますか?これらの行をコピーして貼り付けることなく、NUM_WIDGETS を便利に変更できるようにしたいと考えています。

4

4 に答える 4

1

前にコメントで述べたように、プリプロセッサよりもテンプレートを使用する方が簡単です。

最初にテンプレートを定義します

 template<unsigned n> void invoke() {Library.function<n>();  invoke<n-1>();};

次に、何もしない終了条件を特殊化します

 template<> void invoke<0U>() {};

そしてそれを呼び出します

 int main()
 {
      invoke<NUM_WIDGETS>();
 }

これにより、指定された順序とは逆の順序で関数が呼び出されます。これは、テンプレート関数を次のように変更することで修正できます

 template<unsigned n> void invoke() {Library.function<NUM_WIDGETS + 1 - n>(); invoke<n-1>();};

同じ特殊化を維持して再帰を終了します。

もちろん、壊れたデザインを示唆するこのようなトリックを (プリプロセッサまたはテンプレートを使用して) 行う必要がある場合Library.function()は、そもそもなぜテンプレートなのかを尋ねる必要があります。

于 2018-07-17T03:09:07.873 に答える