質問: first class の条件はWikipediaによると * 無名のリテラルとして表現可能である。 * 変数に格納可能である。 * データ構造に格納可能である。 * それ自体が独自に存在できる(名前とは独立している)。 * 他のものとの等値性の比較が可能である。 * プロシージャや関数のパラメータとして渡すことができる。 * プロシージャや関数の戻り値として返すことができる。 * 実行時に構築可能である。 * 表示可能である。 * 読み込むことができる。 * 分散したプロセス間で転送することができる。 * 実行中のプロセスの外に保存することができる。 だそうですが、c++の場合は * 無名のリテラルとして表現可能である。 : lambdaを使えば可能 * 変数に格納可能である。: funtion objectが存在 * それ自体が独自に存在できる(名前とは独立している)。: 関数literalの条件とさほど変わらない条件だと考えます。 * 他のものとの等値性の比較が可能である。: function objectの比較を考えるのなら、一応可能だと言っていいと思います。しかし、関数をデータ構造そのものとして考える場合は無理でしょう。 * プロシージャや関数のパラメータとして渡すことができる。: 可能 * プロシージャや関数の戻り値として返すことができる。: 可能 はだいたい満足するのではないか、と思います。上記により、第一級関数を扱える場合の嬉しいものとしてよく言われるclosureみたいのなら、c++でも実装可能になります。 では残った条件として: * 表示可能である。: 曖昧な言葉ですが、データ構造の表示を意味しているのなら、できないでしょう。そもそもruntimeで関数のデータ構造をいじったり見たりすることはc++ではできませんので。 * 読み込むことができる。: これもまた曖昧ですが、上記と同じようなことだとおもいます。 * 分散したプロセス間で転送することができる。 * データ構造に格納可能である。:これは上記と合わせてhomoiconityについて述べているようですが、曖昧です。しかし、homoiconityが満足されれば一応、これは満足できるものです。 * 実行時に構築可能である。 * 実行中のプロセスの外に保存することができる。 がありますが、上記は大体、関数をruntimeで生成できないこと、つまり関数がデータ構造として扱われないことによるものです。しかし、他の言語で関数をruntimeで生成できるからと言って、特にc++の使い方とさほど変わらないような気がします。あるとしたらevalみたいな関数が実行時に柔軟に存在できるぐらいではないでしょうか。runtimeで関数が生成できるとどのような使い方ができますか?
回答: closureみたいなものなら実装可能というか、C++11の関数オブジェクトはclosureと言えるでしょう。そしてclosureにclosureや値をキャプチャできる以上、関数オブジェクトは動的に構築可能と言えます。組み込み演算子やステートメントをそのままはめ込むことはできないものの、それも関数にしておけばいいですし。 言い換えると、closureの利点がほぼそのまま、関数を動的に構築できることの利点になると思います。 一方、ネイティブコード生成のことを指すのであれば、確かにC++にその機能はないでしょう。この場合の利点としては、前述の「関数オブジェクトの組み合わせ」に比べて高速に動作する可能性があります。C#だとシリアライザを動的に生成するときに動的コード生成が用いられたりしますね。