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