5

特にlinuxでg ++を使用すると、特定の文に対してどのオーバーロードされたテンプレート関数が選択されたかを判断する方法はありますか?コンパイラはどのオーバーロードされたテンプレート関数を選択したか教えてくれますか?

具体的には、さまざまなライブラリからのヘッダーファイルにある可能性があるすべての選択肢を必ず知っているとは限りません。私が行ったとしても、関連するコードを変更できるとは考えていません。

+0

をhttp://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-codeは有用かもしれません - つまり、中間のコンパイラの手順を見てください。もしこれを一度しか行いたくない場合は、生成されたオブジェクトファイルを見ることができ、理解したい呼び出しを囲む "マーカー"関数呼び出しを置くことができます。オブジェクトファイルには、呼び出された関数のシンボル名が表示されます。これは呼び出された関数の署名(一意でなければならない)に戻って返すことができます。 – Yakk

+5

私は、コンパイル時のデバッガが必要なので、実際に何が起こっているかを見るために、テンプレートのインスタンス化を評価したり、テンプレートの引数などを調べたりできるようにすることがよくありました。 –

+0

あなたが* see *と言うとき、正確にはどういう意味ですか? ClangはC++用に完全に形成されたASTを作成することで有名ですが、 "見る"ことができるようにライブラリの周りにプログラムを書く必要があります。 –

答えて

1

私はこれを直接行う方法がわかりません。

最も簡単な解決策は、コールサイトでブレークポイントを設定し、呼び出された関数にシングルステップを実行することです。

Eclipse CDTのようなIDEは、すべてがうまくいけば、オーバーロードとテンプレート解決自体を行うことができるので、関数呼び出しを右クリックして関数宣言に移動すると、デバッガはあなたの関数を教えてくれます。適切な機能にあなたを連れて行きます。

this answerで説明されているように意図的にあいまいな関数呼び出しを作成すると、使用可能なすべてのオーバーロードとテンプレートのリストを取得できます。

Matthieu M.が言ったように、Clangはdump its ASTと言いました。これにはいくつかの解釈が必要ですが、どの関数が呼び出されているか把握するのに役立ちます。

+0

ありがとうございます。もしEclipseが本当にそれを行うことができれば、私は感銘を受けており、それは良い解決策になるでしょう。 –

+0

@ c-urchin - さまざまなソースファイルとヘッダーファイルを正しく認識するためのEclipseの使用は難しい場合があります。特に複雑なC++コードでは混同することはほとんどありませんが、動作したらとても便利です。 –

+0

@ c-urchin - MS VSもそれを行うことができます。マウスカーソルを関数の名前に移動すると、呼び出している関数のオーバーロード関数の名前とオーバーロード関数の数を見ることができます。私は現代のIDEがそれをしなければならないと思います。 – SergV

1

部分的な答え。

あなたはGNU C++の場合はMacro/keyword which can be used to print out method name?

(実行時に関数の名前を印刷するための非標準のマクロを使用することができます。このコード(http://ideone.com/PI39qK)から

#include <iostream> 
using namespace std; 
template <typename T> 
void f(const T & t) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(const string &) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(int) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
int main() 
{ 
    f(1.0); 
    f(1); 
    f(string("sss")); 
    string a; 
    f(a); 
} 

出力:

void f(int) 
void f(int) 
void f(const std::string&) 
void f(T&) [with T = std::string] 
+0

ありがとうございましたが、私が言ったように私はソースコードを修正することはできませんし、どのコードも任意の#includeファイルから来るかもしれないので、 –