Может компилятор сказать мне, какую перегруженную или шаблонную функцию он выбрал?
В частности, используя g++ в linux, есть ли способ определить, какая перегруженная или шаблонная функция была выбрана для конкретного оператора?
Более конкретно, я не предполагаю, что я обязательно знаю все возможные варианты, которые могут быть в заголовочных файлах, поступающих из различных библиотек. И даже если бы я это сделал, я не предполагаю, что смогу изменить соответствующий код.
2 ответа
Частичный ответ.
Вы можете использовать нестандартный макрос для печати имени функции во время выполнения ( Макрос / ключевое слово, которое можно использовать для вывода имени метода?
Для 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]
Я не знаю, как сделать это напрямую.
Самое простое решение - установить точку останова на месте вызова и выполнить пошаговый переход к любой вызываемой функции; Ваш отладчик может затем сказать вам, в какой функции вы находитесь.
Среда IDE, подобная Eclipse CDT, может выполнять перегрузку и разрешать шаблоны самостоятельно (если все работает правильно), поэтому щелчок правой кнопкой мыши по вызову функции и переход к объявлению функции приведут вас к соответствующей функции.
Умышленно создавая неоднозначный вызов функции, как описано в этом ответе, вы можете получить список всех доступных перегрузок и шаблонов и, возможно, выяснить, какой из них вызывается оттуда.
Как сказал Матье М., Clang может сбросить свой AST. Это требует некоторой интерпретации, но может помочь вам определить, какая функция вызывается.