2017-05-10 3 views
1

2 CppCon Gabriel Dos ReisのモジュールTSに関する話題。C++ 20?モジュール - 秘密のエクスポートなし

私が覚えているように、彼はプライベートメンバー/関数をエクスポートしたくないので、他のモジュールはそれらをまったく使用できません。

私は彼の立場を理解していますが、将来のC++のリフレクションと衝突しませんか?たとえば、C++にすべてのクラス関数を列挙できるリフレクションがある場合、プライベート関数も列挙できませんか?

私が知っている、プライベートな機能へのアクセスは悪いですが、稀な極端な場合には(const_castを書き込みを開発者が、それはひどいと感じなければならないという事実にもかかわらず、時々必要であるか)が必要です

編集:

クラスが "非仮想インターフェイス"パターンを使用する場合、少なくとも1つの "非公開の公開"の例外があります

+0

これが可能であれば、これはカプセル化を強制するかもしれません。さらに、C++の哲学は「あなたが使っているものだけを支払う」ため、モジュールに反映を期待して情報を保存させることは慣用的ではないかもしれません。プライベート関数を削除しようとする最適化はどうですか?もし彼らがプライベートであることを意図されている場合、彼らはさらされるべきですか? – VermillionAzure

+0

ランタイムについて「見ているものだけを支払う」ではありませんか?コンパイル時C++は現在、反対の考え方を使用しています:) – Alek86

+0

残念ながら、私はコンパイル時についてはあまり知らないでしょう。 – VermillionAzure

答えて

2

モジュールは、C++の基本レベルでの動作方法を変更しません。それは、アクセス可能な名前とアクセス可能な場所からいくつかの変更を行います。しかし、それらの名前で言語がどのように機能するかは変わりません。

静的なリフレクションが発生し、クラスのプライベートメンバーについて話すことができれば、クラスのプライベートメンバーについて話すことができます。そのクラス定義が#includeディレクティブまたはモジュールインクルードを介して提供されるかどうかは関係ありません。

Gabriel Dos Reisが望んでいることを許可するには、反映ルールを明示的に除外する必要があります。そして、それは起こりそうにありません。

また、それほど重要ではありません。プライベートメンバー(およびそれらが扱う非エクスポートタイプ)はモジュールファイルをかなり小さくすることができますが、この余分なモジュールファイルサイズはそれほど大きなものにはならないと思います。あなたができる主なことは、あなたのモジュールを含むモジュールを再コンパイルする必要のないモジュールソースコードをある程度変更することです。しかし、よくモジュール化されたコードベースは、とにかく比較的速くコンパイルされるべきです。ですから、それはいいですが、それはほとんど不可欠です。

+0

しかし、この場合はC++ 20 Standardのようになります:モジュールがエクスポートされると、すべての内部クラスとその非プライベートメンバ関数がエクスポートされ、他のモジュールで参照されます。明示的に言えば「私的」という言葉。 – Alek86

+0

@ Alek86:いいえ。現在の論文では、一般公開と非公開については何も言及していません。名前付きエンティティはモジュールのインターフェースの一部であり、それをインポートする誰にでも見えるということだけです。クラスをエクスポートすると、クラスが表示されます。 –

関連する問題