Может компилятор сказать мне, какую перегруженную или шаблонную функцию он выбрал?

В частности, используя 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. Это требует некоторой интерпретации, но может помочь вам определить, какая функция вызывается.

Другие вопросы по тегам