リフレクションは、他の言語の開発者が c++ に非常に欠けていると感じる機能の 1 つです。特定のアプリケーションについては、その理由がよくわかります。リフレクションがあれば、IDE のオートコンプリートのようなものを書くのはとても簡単です。確かに、シリアライゼーション API があれば、もっと簡単になるでしょう。
一方、C++ の主な信条の 1 つは、使用しないものにはお金を払わないことです。これは完全に理にかなっています。それが私が c++ で気に入っていることです。
しかし、妥協点があるかもしれないと思いました。std::type_info
コンパイラが構造に拡張機能を追加しないのはなぜですか? 実行時のオーバーヘッドはありません。バイナリは最終的に大きくなる可能性がありますが、これは有効/無効にする単純なコンパイラ スイッチである可能性があり、正直なところ、スペースの節約が本当に心配な場合は、とにかく例外と RTTI を無効にする可能性があります。
テンプレートの問題を指摘する人もいますが、コンパイラはstd::type_info
すでにテンプレート型の構造を喜んで生成しています。
-fenable-typeinfo-reflection
非常に普及する可能性のある g++ スイッチのようなものを想像できます(そして、boost/Qt/etc のような主流のライブラリは、それを使用するコードを生成するためのチェックを簡単に行うことができます。スイッチ)。このような大規模なポータブル ライブラリは既にコンパイラの拡張機能に依存しているため、これが不合理だとは思いません。
では、なぜこれがより一般的ではないのでしょうか。何かが足りないと思いますが、これに関する技術的な問題は何ですか?
編集:いくつかのメトリックが肥大化の引数を再定義します:
私はかなり大きな Qt プロジェクト (約 45,000 LoC) を見て、メタオブジェクトのサイズを測定しました。Qt moc システムはかなり網羅的なリフレクション システム (型、関数、列挙、メンバー、および "プロパティ" などのいくつかの Qt 固有の概念) であるため、これは妥当なメトリックだと思います。合計 67 個のメタオブジェクトがあったため、些細な量ではありませんが、おかしなことではなく、合計で5479 バイトになりました。ただし、それらのほとんどは 32 バイト以下 (最大は 1427 バイト) でした。最新のコンパイラは、最も単純なプログラムでも 4K 以上のバイナリを生成することを考えると、これらの数値は法外ではありません)。STL
このようなものが に適用されて、それがどのように公平になるかを確認したいと思います。