[〜#〜] sfinae [〜#〜] およびtemplate
メタプログラミングは素晴らしいことを行うことができ、多くのライブラリもそれらをかなり使用しています。
歴史的に、これらの「魔法の概念」は両方とも、C++で意図的に導入/サポートされていましたか?または、元々のtemplate
プログラミングの有用な副産物(副産物)として後で発見されましたか?
会議の日から約10年前、私はたまたまErwin Unruhとパブで自分自身を見つけました他にも数人、私は彼にプログラムについて尋ねた VJovicが言及した 。それまでにビールを2、3本持っていて、それは非公式の会合であり、それは10年間私の頭の中に住んでいたので、これを塩の粒と一緒に持っていきますが、私の記憶によれば:
彼は、STLをより適切に提供するためにテンプレート機能を追加したと述べました。彼によると、委員会の何人か/多くは、彼らがその完全な能力を知らずに何かを作成していると感じました。彼自身、すべてのテンプレート、特に部分的な特殊化がチューリング完全言語を構成していると疑い、彼は常にそれを正式に証明するつもりでしたが、そうすることはありませんでした。
代わりに、標準化会議で一晩彼はそれを思いついた エラーメッセージとして素数を出力するプログラム (最新のコンパイラで動作するバージョンは ここ )で、その間に計算されたコンパイル。テンプレートメタプログラムとしては、今日の標準ではそれほど印象的ではありませんが、結局のところ、これは最初のものでした。誰かが彼が冗談だと思ったことを正式にプログラムに提出して作成し、公式のISO標準化文書になりました。
私は具体的に彼にプログラムへのBjarne Stroustrupの反応について尋ねました、そしてそれに応えてアーウィンは彼の目を彼の手で覆うことによって彼をまねしました。 :)
Todd Veldhuizenもその会議に出席していたので、後悔していました。 彼は表現テンプレートを思いついた 。 (彼は確かに話をするのにうれしい人でした。)しかし、私はずっと若かったので、生涯の機会を逃してしまいました。 :(
E. Unruhは、1994年にC++標準化委員会の会議中に、テンプレートを使用してコンパイル時に何かを計算できることを発見しました。彼は素数を出力するプログラムを書いた。この演習の興味深い部分は、素数の生成が、実行時ではなく、コンパイルプロセス中にコンパイラーによって実行されたことです。このプログラムは完全に移植可能ではありませんでしたが、プログラムは、テンプレートのインスタンス化メカニズムがコンパイル時に重要な計算を実行できる原始的な再帰言語であることを示しました。
この抜粋は、VandevoordeとJosuttisによる「c ++テンプレート」からの抜粋です(第17章)。
ご覧のとおり、早く発見され、その力はすぐに認められました。