web-dev-qa-db-ja.com

C ++ 1zでのコンパイル時の反映?

C++標準化委員会には、C++ 1z以降でコンパイル時の反映を提供するための研究グループがあります。正確な目的は何か、期待されるツールはどれほど強力になるのか知りたいのですが。

たとえば、これらのツールを使用して関数やクラスに名前を付けることは可能ですか?

struct A {int f() {return 42;}};
struct B {int (std::reflect<A>::member<0>::declname)() {return 43;}};
// equivalent to struct B {int f() {return 43;}};

これほど強力ではない場合、一般的なユースケースはどのようになりますか?

32
Vincent

リフレクションのユースケースはN3814で概説されています。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3814.html

一般的な見解は、N3815に例示されているように、TypeTraitsライブラリの拡張としてそれを行うというものです。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3815.html

反射には2つの部分があります。 1つ目はイントロスペクションです。エンティティを取得し、それに関する定数値をクエリします。 2つ目は具体化で、これは逆です。値を使用して新しいエンティティを作成します。

イントロスペクションの場合-コンパイル時にクラスメンバー、基本クラス、列挙子、関数パラメーターなどの名前を列挙して取得できる追加の特性を期待できます。そこから、シリアル化、メンバーごとの操作、静的チェックなどのさまざまな目的でそれらを使用できます。

さらに後で、具体化について検討します。これには、テンプレートを使用する場合よりも表現力のある定数値から新しいエンティティを作成することが含まれます。したがって、おそらく_std::class_specifier s_構造体に入力してから、make_type_from_spec(s)を呼び出して型を作成することができます。

内省的アプローチは現時点でより多くのコンセンサスを持っており、具体化の側面はさらに離れています。

32
Andrew Tomazos