私は最近、C++でテンプレートのメタプログラミングを始めており、いくつかの基本機能をそれぞれの再帰的コンパイル時テンプレート定義に変換しようとしています。例えばC++は再帰的なクラス定義をどのように扱いますか?
:
template <typename T, T A, unsigned int N>
class pow { enum : T { value = A * pow<T, A, N-1>::value } };
template <typename T, T A> class pow<T, A, 0> { enum : T { value = 1 } };
構文とテンプレートの力が私を驚かせます。しかし、1つの質問は私を悩ましています: C++はどのようにそれらの再帰的定義を扱いますか?より具体的に(賢明な資源)
または:
- コンパイラが(/どのようにメモリが割り当てられている)列挙値を含むテンプレートクラスのインスタンスの作成をどのように処理します
?
生成されたすべてのクラスは、コンパイル後にメモリに残っているのですか、またはトップクラス(クリーンアップ)のみを保持するコンパイラによって最適化されていますか?
RAMに依存しない最大の再帰的な深さはありますか(コンパイラー自身の制限事項)?
このような構造の標準編集に関する詳細な説明は高く評価されます。
を警告する "最大の再帰の深さは...どのあり、" _: '-ftemplate-深さを有する++グラム=参照N'ます。https://gcc.gnu .org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html#C_002b_002b-Dialect-Options –
これはcurrenrly 1024です。しかし、それはコンパイラの制約か慣例なのか(これまでのC++標準では17が奇妙な選択だったので)? –
コンパイラがインスタンス化された型をダンプすることは想像もできません。後で何度か使用されるかどうかを知る方法がないからです。リンクフェーズでは、ある種類のカリングが実行されます。そして、メタプログラミングでは、完全なものになることを期待しています。 – SoronelHaetir