メタプログラミング


10

私はC ++開発者として旅を始めたばかりで、最近、メタプログラミングと呼ばれるトピックを研究しています。これまでのところ、このトピックに関する多くの情報を調査してきましたが、質問はほとんどありません。

  1. c ++でのReflectionの使用:可能ですか?私の理解によると、リフレクションはプログラムの状態を操作する能力を備えたメタプログラミング手法であり、その操作は内省したり、内省したりすることができます。

  2. リフレクティブアーキテクチャとメタレベルアーキテクチャの違いは何ですか?メタプログラミングアーキテクチャはどのカテゴリに分類されますか?

  3. メタプログラミングには、メタレベルとベースレベルの2つのレベルがあります。私の理解では、調査中のオブジェクトプログラムまたはシステムはベースレベルであり、調査中のシステム上で動作するメタプログラムはメタレベルです。私は正しいですか?

また、C ++でのテンプレートメタプログラミングの作業に関するガイドラインを提供してください。
このプログラミング手法を実践するために私が探すことができる実用的な例をいくつか教えていただけますか?


2
この質問は、stackoverflowよりもプログラマに属している可能性があります。前者はより理論的で、後者はより実用的です。いくつかの部分は、容易に実用的な観点から答えることができるC ++は、反射を有していないが、他のコードに関連する(例えば、反射とメタレベルアーキテクチャの差)ではない
デビッドロドリゲス- dribeas

このSOの答えは、C ++は、反射を持っていない理由アドレス:stackoverflow.com/q/359237/120163、およびいくつかの弱いC ++ひどく、それをシミュレートするための技術。
Ira Baxter

メタプログラミングに非常に興味がある場合は、この点でC ++よりも明確なD言語をご覧になることをお勧めします。
deadalnix '19年

回答:


10

メタプログラミングとは、単に、他のコードを(広い意味で)記述するコードを記述する手段があることを意味します。C ++は、基本的にタイプセーフなマクロ言語であるテンプレートメカニズムを通じてこれを行います。テンプレート拡張ステップを適用するだけで完全に可能であり、結果は有効なテンプレートフリーのC ++コードになります。

リフレクションは、実行時に独自の言語要素を検査(および多くの場合は変更)するプログラミング言語および/またはランタイム環境の機能です。通常、リフレクティブ言語は、クラス、メソッド、変数、パラメーターなどの言語要素を表すデータ構造と、それらを検査、変更、作成するためのルーチンまたはクラスを提供します。変更機能により、他のコードを生成するコードを記述できるため、リフレクションは一種のメタプログラミングになります。

メタプログラミングの他の例としては、コードジェネレーター、自己変更バイナリー(これらは20年前ほど今日では一般的ではありません)、Cマクロなどがあります。カリー化や同様の関数型プログラミング手法も一種のメタプログラミングであると主張することができます。


+1私は本当にあなたの答えが好きで、C#のようなサービスとしてコンパイラを使用するか、Javaのようなスクリプトエンジンを使用して、ランタイムで構築されたコードを実行することについて質問したいと思います。これも一種のメタプログラミングではありませんか?
M.Sameer

では、PythonインタープリターをCで作成する人は誰でもメタプログラミングですか?オブジェクト指向言語をSQLにマップするORMの実装はどうですか?すべてのWebフレームワークはメタプログラミングの例ですか?
kojiro

1
  1. いいえ、違います。C ++プログラムはマシンコードにコンパイルされ、クラスなどに関するすべての情報は失われます(.NET環境でC ++ / CLIを使用している場合を除きますが、それは純粋なC ++ではありません)。

2-3。わかりません-それを助ける別の答えを待ってください:-)

C ++テンプレートを使用したメタプログラミングは非常に強力ですが、複雑でもあります。テンプレートの拡張には、C ++が使用する命令型プログラミングではなく、関数型のプログラミングが必要です。関数型プログラミングの経験がない場合は、迂回して基本的なlisp、haskell、またはスキームを学ぶことをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.