C ++では、SFINAEとメタプログラミングは意図的でしたか、それとも単なるテンプレートの副産物でしたか?


11

SFINAEtemplateメタプログラミングは素晴らしいことを行うことができ、多くのライブラリーもそれらをかなり使用しています。

歴史的に、これらの「魔法の概念」は両方とも、C ++で意図的に導入/サポートされていましたか?または、それらは後にオリジナルのtemplateプログラミングの有用な副産物(副産物)として発見されましたか?

回答:


19

会議の日から約10年前、私はたまたまErwin Unruhと他の何人かと一緒に居酒屋で自分自身を見つけ、VJovicが言及したプログラムについて彼に尋ねました。その時までにビールを2、3本持っていて、それは非公式の会合であり、それは私の頭の中に10年間住んでいるので、これを塩の粒と一緒に持っていきますが、私の記憶によれば:

彼は、STLをより適切に提供するために、テンプレート機能を追加したと述べました。彼によると、委員会の何人か/多くは、彼らがその完全な能力を知らずに何かを作成していると感じました。彼自身、すべてのテンプレート、特に部分的な特殊化がチューリング完全言語を構成していると疑い、彼は常にそれを正式に証明するつもりでしたが、そうすることはありませんでした。

その代わり、彼は標準化会議のある夜、コンパイル中に計算したエラーメッセージ(最新のコンパイラで動作するバージョンはこちらとして素数を出力するプログラムを思いつきました。テンプレートメタプログラムとしては、今日の標準ではそれほど印象的ではありませんが、結局のところ、これは最初のものでした。誰かが彼が冗談だと​​思ったことを正式にプログラムに提出して作成し、公式のISO標準化文書になりました。

私は具体的に彼にプログラムへのBjarne Stroustrupの反応について尋ねました、そしてそれに応えてアーウィンは彼の目を彼の手で覆うことによって彼をまねしました。 :)

振り返って、その会議にも参加していたTodd Veldhuizenに式テンプレートをどのよう考案したのか尋ねなかったことを後悔しています。(彼は確かに話をするのにぴったりだった。)しかし、私はそれよりずっと若かったので、生涯の機会を逃してしまった。:(


+1、面白い経験。彼らはSFINAEについて何か話しましたか?
iammilind 2011

@iammilind:SFINAEは、彼が言及したSTLをよりよくサポートするために追加された機能の1つにすぎないと思いますが、「SFINAE」モニカはその後数年しか造られていません。
sbi 2011

11

1994年にE. Unruhは、c ++標準化委員会の会議中に、テンプレートを使用してコンパイル時に何かを計算できることを発見しました。彼は素数を出力するプログラムを書いた。この演習の興味深い部分は、素数の生成が、実行時ではなく、コンパイルプロセス中にコンパイラーによって実行されたことです。このプログラムは完全に移植可能ではありませんでしたが、プログラムは、テンプレートのインスタンス化メカニズムがコンパイル時に重要な計算を実行できる原始的な再帰言語であることを示しました。

この抜粋は、VandevoordeとJosuttisによる「c ++テンプレート」からの抜粋です(第17章)。

ご覧のように早く発見され、すぐにその威力が認められました。


2
いいね。私がインターネットで読んだこの種の記事も、出典を覚えていません。これはSFINAEにも当てはまりますか?
iammilind 2011

@iammilind「これはSFINAEにも当てはまりますか」とはどういう意味ですか?
BЈовић

1
SFINAEは通常、コンパイラによるサポートを必要とします。そのため、誤って発見されていない可能性があります。
iammilind 2011

@iammilind私は本から同様のテキストを持つ情報提供者の記事を見つけました:informit.com/articles/article.aspx?p
30667&

@iammilind回答を編集しました。テンプレートに対するコンパイラのサポートが制限されていたため、それは偶然だったと思います。プログラムは、ポータブルではなかった、と私はそれが1つのコンパイラにのみ働いたと思う
BЈовић
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.