特に Linux で g++ を使用する場合、特定のステートメントに対してどのオーバーロード関数またはテンプレート関数が選択されたかを判断する方法はありますか?
より具体的には、さまざまなライブラリからのヘッダー ファイルにある可能性があるすべての可能な選択肢を知っているとは限りません。たとえ変更したとしても、関連するコードを変更できるとは思いません。
特に Linux で g++ を使用する場合、特定のステートメントに対してどのオーバーロード関数またはテンプレート関数が選択されたかを判断する方法はありますか?
より具体的には、さまざまなライブラリからのヘッダー ファイルにある可能性があるすべての可能な選択肢を知っているとは限りません。たとえ変更したとしても、関連するコードを変更できるとは思いません。
これを直接行う方法がわかりません。
最も簡単な解決策は、呼び出しサイトにブレークポイントを設定し、呼び出された関数にシングル ステップで入ることです。デバッガーは、現在どの関数にいるかを知ることができます。
Eclipse CDTのような IDE は、(すべてが正しく機能する場合) オーバーロードとテンプレートの解決自体を行うことができるため、関数呼び出しを右クリックして関数宣言に移動すると、適切な関数に移動します。
この回答で説明されているように、あいまいな関数呼び出しを意図的に作成することで、使用可能なすべてのオーバーロードとテンプレートのリストを取得し、そこからどのオーバーロードが呼び出されているかをおそらく把握できます。
Matthieu M. が言ったように、Clang はAST をダンプできます。これには多少の解釈が必要ですが、どの関数が呼び出されているかを理解するのに役立ちます。
部分的な回答。
実行時に関数の名前を出力するために非標準マクロを使用できます (マクロ / メソッド名を出力するために使用できるキーワード?
GNU C++ の場合:
#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);
}
このコードからの出力 ( http://ideone.com/PI39qK ):
void f(int)
void f(int)
void f(const std::string&)
void f(T&) [with T = std::string]