可以编译器告诉我它选择的哪个超载或模板功能

can compiler tell me which overloaded or template function it chose?

本文关键字:超载 功能 编译器 告诉我 选择      更新时间:2023-10-16

专门在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]