2011-01-23 7 views
4

メタプログラミングについて読んだところ、本当に面白かったです。たとえば、数値がプライムであるかどうかを調べ、フィボナッチ数を計算します。私はすべてのランタイムソリューションをメタプログラミングに変換することができれば、その実用的な使い方について興味があります。配列の最大値を求めるとしましょう。ソートされていない場合は、実行時にO(n)を使用します。メタプログラミングでO(1)を得ることは可能ですか?すべての通常のプログラミングタスクをメタプログラミングを使用してコンパイルすることは可能ですか?

おかげで、あなたがすることはできません
チャン

+0

C++メタプログラミングは、完全なソースコード生成に似ています。 –

+1

@Industrial:まさにその通りです。しかし、チューリングマシンもそうです。言い換えれば、実際に何が使えるかについて何も役に立たないとは言えません。 –

答えて

5

メタプログラミングはコンパイル時にのみ知られている入力のために動作しますので。だから、コンパイル時に知られている一定の与えられたフィボナッチ数を計算メタ関数持つことができます。

int value = Fibonacci<5>::Value; 

をしかし、それは、実行時にユーザーによって入力された値のために動作しません。

int input = GetUserInput(); 
int value = Fibonacci<input>::Value; // Does not compile 

確かに、新しい値を得るたびにプログラムを再コンパイルすることはできますが、それは重要ではないプログラムにとっては実用的ではありません。

C++でのメタプログラミングは、基本的にC++でテンプレートを処理する方法の「有用な偶発的な悪用」であることに注意してください。テンプレートのメタプログラミングは確かにではありませんでした。 C++標準よりも前にC++標準を作成する際にC++標準委員会が念頭に置いていたことは何ですか?内部コンパイラエラー(これは最近では新しいコンパイラで変更されましたが、あなたはまだ外に出てはいけません)が得られるまで、コンパイラをあまりにも多く押し込むことができます。

実際に何が役に立つのかを知りたい場合は、先進的な本dedicated to C++ template metaprogrammingがあります。

+0

例えば、リレーショナル・スキーマに基づくビジネス・ロジックは、膨大な量のコードを除去して劇的に再作成することができますが、入力は単なるよく知られているわけではないが完全に指定されているからです。 –

+0

+1 "メタプログラミングはテンプレートの悪用です"。より良いものにできませんでした! –

+0

非常に良い点!ありがとう! – Chan

2

コンパイル時に知られているデータ(実行時には分かっていません)を処理することについては、理論的にははいです。

実際には、重要ではないタスクはすぐには不可解なテンプレートコードの厄介な問題になり、コンパイルに失敗したときにはさらに邪魔にならないエラーメッセージが出ます。さらに、ほとんどのC++コンパイラは、爆発する前に特定の深さのテンプレートネストを許容することしかできません。

5

コンパイルボタンを押したときにわからない場合は、メタプログラミングによって解決できません。

+0

非常に洞察力があります!まことにありがとうございます。 – Chan

2

もちろん、あなたはシステムコールを行うことはできません。すべてのユーザーはあなたのプログラムを実行するためにコンパイラを必要とします。ユーザー入力は定数式を定義する形をとる必要があります。実行時ではなくコンパイル時に '実行'するように、C++のテンプレートコード内のプログラムについて書きます。

関連する問題