メタクラスについて勉強してみました。
メタクラスについて勉強してみた。
class とか structっていうキーワードを使う箇所をユーザー定義したものに変えて
my_class Hoge{};
みたいに使います。
んで、 何ができるかというと
例えばC++ではstructはデフォルトpublic, classはprivateっていう話がありますが、
そーゆーデフォルト時のルールを決めることができたり、違反したらコンパイルエラーにできたりする。
メンバ変数は指定しなければprivateになる。すべてprivateじゃなければコンパイルエラー!みたいな
例だとinterface メタクラスを例に上げていた
$class interface { // デストラクタ定義 ~interface() noexcept { } constexpr { // メンバ変数はもったらコンパイルエラー compiler.require($interface.variables().empty(), "interfaces may not contain data"); for (auto f : $interface.functions()) { // コピー、ムーブはコンパイルエラー compiler.require(!f.is_copy() && !f.is_move(), "interfaces may not copy or move; consider a" " virtual clone() instead"); // アクセス指定子いないならpublicにする if (!f.has_access()) f.make_public(); // public以外があったらコンパイルエラー compiler.require(f.is_public(), "interface functions must be public"); // 純粋仮想関数とする f.make_pure_virtual(); } } };
interface IHoge
{
void hoge();
};
が
class IHoge { public: virtual ~IHoge() = 0; virtual void hoge() = 0; };
みたいになるという感じですかね
未来の話なのでどうなることかわからんが、面白そうだった
参考
https://www.fluentcpp.com/2017/08/04/metaclasses-cpp-summary/