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

В частности, используя g ++ в linux, есть ли способ определить, какая перегруженная или шаблонная функция была выбрана для конкретного оператора?

Более конкретно, я не предполагаю, что я обязательно знаю все возможные варианты, которые могут быть в заголовочных файлах, поступающих из различных библиотек. И даже если бы я это сделал, я не предполагаю, что смогу изменить соответствующий код.

5

Решение

Я не знаю, как сделать это напрямую.

Самое простое решение — установить точку останова на месте вызова и выполнить пошаговый переход к любой вызываемой функции; Ваш отладчик может затем сказать вам, в какой функции вы находитесь.

IDE, как Eclipse CDT может выполнять перегрузку и разрешение шаблона самостоятельно (если все работает правильно), поэтому щелчок правой кнопкой мыши по вызову функции и переход к объявлению функции приведут вас к соответствующей функции.

Преднамеренно создавая неоднозначный вызов функции, как описано в этот ответ, Вы можете получить список всех доступных перегрузок и шаблонов и, возможно, выяснить, какой из них вызывается оттуда.

Как сказал Матье М., Clang может свалить его АСТ. Это требует некоторой интерпретации, но может помочь вам определить, какая функция вызывается.

1

Другие решения

Частичный ответ.

Вы можете использовать нестандартный макрос для печати названия функции во время выполнения (Макрос / ключевое слово, которое можно использовать для вывода названия метода?

Для 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]
1

По вопросам рекламы [email protected]