5

関数呼び出しの候補関数(または実行可能な関数または最も実行可能な関数)をダンプするにはどうすればよいですか?

g++がクラス階層をダンプするオプションを提供していることを私は知っています。(実際、Visual Studio 2010にも同様のオプションがありますが、文書化されていません。VC++チームのブログで何か読んだことを覚えていますが、はっきりとは覚えていません。)

最近、C ++ 0xドラフトの過負荷解決について読んでいて、本当に恥ずかしい思いをしました。

候補関数、実行可能な関数、または実行可能な最良の関数をダンプするオプションを提供するコンパイラはありますか?

注:過負荷解決シナリオの候補関数は、コンパイラー・エラーの候補関数とは異なります。過負荷解決シナリオの候補/実行可能/実行可能関数には、独自の意味があります。過負荷解決には3つの段階があることを私は知っています。候補関数を見つけます。実行可能な機能を見つけます。最高の実行可能な機能を見つけます。通常、実行可能な最良の機能は1つの候補だけです。それ以外の場合、呼び出しはあいまいです。各ステージには独自のルールがあります。

4

3 に答える 3

2

Visual Studio でこれを行う最も簡単な方法は、あいまいな呼び出しをコンパイルすることです。コンパイラは、利用可能な候補のリストとともにエラーを吐き出します。おそらく g++ も同じことをするでしょう。

于 2010-09-20T11:03:19.877 に答える
2

考慮されたすべての関数をダンプする 1 つの方法は、特定の関数名を、何にも一致しないパラメーターのセットと共に使用することです。

struct DumpThemAll {};

int main(int argc, char* argv[])
{
  std::cout << DumpThemAll() << std::endl;
}

これにより、(通常)operator<<過負荷の解決のために考慮されたすべてがダンプされます。この特定の例では、毛むくじゃらになる可能性があります。

特定の関数だけをダンプしたい場合は、はるかに困難です。それを行う唯一の方法は、あいまいな呼び出しを人為的に作成することですが、提供する偽の関数が最適な一致とまったく同じ「スコア」を持っている場合にのみ、呼び出しがあいまいになります...したがって、そのような関数を考案するのは困難ですあなたはこの採点がどのように機能するかを理解していません (個人的には、私はすべてを理解していません... ルールが多すぎます...)

ただし、頭のてっぺんから過負荷ルールを引用できる、またはおそらくそれを理解できる人はおそらくほんの一握りしかいないかもしれませんが、一般的に、標準のために働くことを妨げるものではないことを付け加えておきます。は、考えられるすべてのケースに対処しようとしますが、それらのいくつかだけを使用します。

さらに、関数/演算子のオーバーロードを悪用すると、プログラムが人間にとって難解で読めなくなります (特に、現在の翻訳単位に含まれるファイルの特定の影響を受けるため)。

于 2010-09-20T11:48:58.853 に答える
2

直接的な方法はないと思います。

1 つの方法は、人為的に競合/あいまいさを故意に作成することです。ほとんどのコンパイラは、次の形式のエラーを出力し、考慮される候補のリストを吐き出します。

namespace A {
    void f(int x) {}
}
void f(int x) {}
void f(char x) {}

using namespace A;

int main(){
    f(2.2);
}

G++ エラー メッセージ:

prog.cpp: 関数 'int main()' 内:
prog.cpp:10: エラー: オーバーロードされた 'f(double)' の呼び出しがあいまいです
prog.cpp:4: 注: 候補は: void f(int)
prog.cpp:5: 注: void f(char)
prog.cpp:2: 注: void A::f(int)
于 2010-09-20T11:06:10.450 に答える