2009-05-06 8 views
6

時々、CまたはC++でプログラミングするときに式の型を知る必要があります。時には私に役立つ良いIDEや存在する文書がありますが、時にはそうではありません。私はしばしば、そのような構成が有用であると感じています。式の型の決定

void (*myFunc)(int); 
printf("%s", nameoftype(myFunc)); //"void (*)(int)" 
int i, unsigned int u; 
printf("%s", nameoftype(i+u)); //"unsigned int" 

これは特にC++の場合に当てはまります。 constオブジェクトのアクセサを考える - 彼らはconst参照またはコピーを返しますか?ダイナミックキャストやテンプレートクラスを考えてみてください。

どうすればいいですか? (すなわち、式のタイプを学ぶ)

私はGCCを使っていますが、わかっている限り、そのような拡張子はありません。だから私は、人々がこの問題をどのように解決するのか興味があると思う。コンパイル時と実行時の両方のソリューションが歓迎されています。

答えて

1

あなたは何をお探しですか?自動型の推論や型を探すので、変数を正しく手動で宣言できますか? (あなた自身の答えは、あなたが2番目のものを持っているように見えます)。この場合、Geordiの使用を検討:

<litb> make type pointer to function taking pointer to array of 10 int returning void 
<geordi> void (*)(int (*)[10]) 

<litb> geordi: { int a = -1; unsigned int b = 0; cout << ETYPE(a + b), ETYPE_DESC(a + b), (a + b); } 
<geordi> rvalue unsigned int, rvalue unsigned integer, 4294967295 

<litb> geordi: << TYPE_DESC(void (*)(int (*)[10])) 
<geordi> pointer to a function taking a pointer to an array of 10 integers and returning nothing 

自動型推論GCCのため__typeof__のようなコンパイラの拡張機能を使用しますboost.typeofのようなヘルパーライブラリ、なし現在のところ不可能です。次に、C++はauto(現在のautoとは異なるセマンティクスを持つ)を取得し、decltypeと一緒にこれを実行して式の型を取得します。 youareはそれがmangeled名前です++グラムを使用している場合

template<typename T> void f(T t) { /* ... */ } 
int main() { int a = -1; unsigned int b = 0; f(a + b); } 
+0

申し訳ありませんが、私は型推論を探していないことは明らかでした。私は自動変数を使って新しいsphagetti C++ 0xコードを見ているのを楽しみにしています:) - うわー、私はGeordiがタイプ記述を行うことができたことを忘れてしまいました。私は実装を見ていきます。 KDevelopリンクにも感謝します。それはEclipseに代わるものかもしれない。 – aib

+1

Geordiのリンクが死んでいます - ここにgithubの現在の場所があります:https://github.com/Eelis/geordi – KarlC

2

C++にはtypeid演算子があります。

typeid(expression).name() 

は、式のタイプの実装定義の名前を返します。悲しいかな、それは通常人間が読めるものではありません。

+3

:ローカルコンテキストから抜け出すと一緒に暮らすことができる場合

、あなたは常にこのような関数テンプレートを作成することができます。次に、コマンドラインツール 'C++ filt'を使用して、それを解凍することができます。 –

+0

ああ、私はC++ filtを使ったことがありません。私はそれを調べます、ありがとう。 – aib

+0

現在のところ、この方法は推奨されていないため、廃止予定の場合もあります。それがタイプを出力しても、タイプ出力は面倒です。さらに、無効なタイプが印刷されることもあります。正確な例は、新しい "Effective Modern C++"、第1章、アイテム4で明確に説明されています。 – likern

13

時々私はちょうど行います

int ***a = expression; 

と探しエラー「<式の型>がポインタへ^ 3 int型に割り当てることはできません」。これは最も移植性の高い回避策のようです。

+1

古いCコンパイラの中には、実際にそれを可能にするものがあります。 :-( –

+3

私はクラス 'FailAssign'を作成し、クラスのインスタンスに式を割り当てようとします。その方法では自動変換は実行されません(バグの場合もあります)。 –

+2

うーん、いい考えです。私の方法ではトリプルポインタを宣言できますが!どのくらいの頻度でそれをすることができますか? :) – aib

1

Boost.Typeofを試してみてください。

+0

それは型推論のための良い解決策のように思えますが、評価するマクロ、または型名を含む文字列を返す関数が表示されませんでした。しかし、中央のREGISTER_()マクロをどのように使用するかを見ると、1つを追加することができます。 – aib

関連する問題