特别是在 linux 上使用 g++,有没有办法确定为特定语句选择了哪个重载或模板函数?
更具体地说,我不认为我一定知道所有可能的选择,它们可能在来自各种库的头文件中。即使我这样做了,我也不认为我可以修改相关代码。
特别是在 linux 上使用 g++,有没有办法确定为特定语句选择了哪个重载或模板函数?
更具体地说,我不认为我一定知道所有可能的选择,它们可能在来自各种库的头文件中。即使我这样做了,我也不认为我可以修改相关代码。
我不知道有什么方法可以直接做到这一点。
最简单的解决方案是在调用点设置断点,然后单步执行调用的任何函数;然后你的调试器可以告诉你你在哪个函数中。
像Eclipse CDT这样的 IDE可以自己进行重载和模板解析(如果一切正常的话),所以右键单击函数调用并转到函数声明将带您到适当的函数。
通过故意创建一个模棱两可的函数调用,如this answer中所述,您可以获得所有可用重载和模板的列表,并且可能可以确定从那里调用哪个。
正如 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]